tutorial - python framework
Django REST framework claves foráneas y filtrado (3)
Lo que debe hacer en su opinión es algo como esto: se llama "búsquedas que abarcan las relaciones"
queryset = Model.objects.filter(make__name__exact=''Alfa Romeo'')
el filtrado de modelos con una capacidad de motor específica es similar
queryset = Model.objects.filter(engine_capacity__exact=5)
si desea combinar ambos filtros, puede encadenarlos:
queryset = Model.objects.filter(make__name__exact=''Alfa Romeo'').filter(engine_capacity__exact=5)
más ejemplos se pueden encontrar aquí haciendo consultas django
Tengo los siguientes modelos en la aplicación django:
models.py :
class Make(BaseModel):
slug = models.CharField(max_length=32) #alfa-romeo
name = models.CharField(max_length=32) #Alfa Romeo
def __unicode__(self):
return self.name
class Model(BaseModel):
make = models.ForeignKey(Make) #Alfa Romeo
name = models.CharField(max_length=64) # line[2]
engine_capacity = models.IntegerField()
trim = models.CharField(max_length=128) # line[4]
Y serializers.py :
from .models import Make,Model
from rest_framework import serializers
class MakeSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Make
fields = (''url'', ''slug'', ''name'')
class ModelSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Model
fields = (''url'', ''make'', ''name'', ''trim'', ''engine_capacity'')
y también views.py :
from rest_framework import viewsets
from rest_framework import filters
from rest_framework import generics
from .models import Make, Model
from .serializers import MakeSerializer, ModelSerializer
class MakeViewSet(viewsets.ModelViewSet):
queryset = Make.objects.all()
serializer_class = MakeSerializer
filter_backends = (filters.DjangoFilterBackend,)
class ModelViewSet(viewsets.ModelViewSet):
make = MakeSerializer
queryset = Model.objects.all()
serializer_class = ModelSerializer
filter_backends = (filters.DjangoFilterBackend,)
Para lo que necesito, quiero buscar todos los modelos fabricados por marca específica. ¿Cómo puedo obtener todos los modelos con una clave foránea particular usando params de consulta? Y mi segunda pregunta: ¿puedo filtrar resultados usando queryparams para obtener modelos con motor_capacity específico?
Un comentario: sería perfecto, si puedo consultar resultados usando algo como esto en url: /api/models/?make=ford
Make
/api/models/?make=ford
donde make es el campo slug
en Make
model
urls.py
url(''^model/by/(?P<make>/w+)/$'', ModelByMakerList.as_view()),
views.py
class ModelByMakerList(generics.ListAPIView):
serializer_class = ModelSerializer
def get_queryset(self):
"""
This view should return a list of all models by
the maker passed in the URL
"""
maker = self.kwargs[''make'']
return Model.objects.filter(make=maker)
Para obtener más información, verifique los documentos .
También puede usar el filtrado con QUERY_PARAMS, pero en mi humilde opinión, esto se ve mejor.
Puede especificar filter_fields = (''make__slug'', )
en su conjunto de vistas. No olvides incluir filter_backends = (DjangoFilterBackend, )
también. También necesitará agregar la dependencia django-filter
. Luego consultas como /api/models/?make__slud=ford
. Note el doble guión bajo.
Docs .