yasg with instalar framework drf coreapi django serialization django-rest-framework

with - Marco django REST-¿conjunto de consultas limitado para ModelSerializer anidado?



instalar django rest (2)

Tengo un ModelSerializer, pero de forma predeterminada serializa todos los objetos en mi modelo. Me gustaría limitar este conjunto de preguntas solo a las 500 más recientes (a diferencia de los 50 millones). ¿Cómo hago esto?

Lo que tengo actualmente es lo siguiente:

class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel

La razón por la que no creo que pueda especificar el conjunto de consultas en mi viewset es que esta es, de hecho, la parte anidada de otro serializador.

models.py

class Container(models.Model): size = models.CharField(max_length=20) shape = models.CharField(max_length=20) class Item(models.Model): container = models.ForeignKey(Container, related_name=''items'') name = models.CharField(max_length=20) color = models.CharField(max_length=20)

views.py

class ContainerViewSet(viewsets.ModelViewSet): queryset = Container.objects.all() # only a handful of containers serializer_class = ContainerSerializer

serializers.py

class ItemSerializer(serializers.ModelSerializer): class Meta: model = Item fields = (''name'', ''color'') class ContainerSerializer(serializers.ModelSerializer): items = ItemSerializer(many=True) # millions of items per container class Meta: model = Container fields = (''size'', ''shape'', ''items'')


En su conjunto de vistas puede especificar el conjunto de preguntas de la siguiente manera:

from rest_framework import serializers, viewsets class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel class MyModelViewSet(viewsets.ModelViewSet): queryset = MyModel.objects.all()[:500] serializer_class = MyModelSerializer

Creo que lo que estás buscando es SerializerMethodField .

Entonces su código se vería de la siguiente manera:

class ContainerSerializer(serializers.ModelSerializer): items = SerializerMethodField(''get_items'') class Meta: model = Container fields = (''size'', ''shape'', ''items'') def get_items(self, container): items = Item.objects.filter(container=container)[:500] # Whatever your query may be serializer = ItemSerializer(instance=items, many=True) return serializer.data

La única pega es que SerializerMethodField es de solo lectura.


Puede usar el parámetro fuente

class Item(models.Model): ... def get_items(self): return self.items[:500]

y en el serializador

items = ItemSerializer(many=True, source=''get_items'', )