with tutorial framework español applications python django rest django-models django-rest-framework

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 .