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'', )