gpt4 book ai didi

django REST 框架 - 嵌套 ModelSerializer 的有限查询集?

转载 作者:行者123 更新时间:2023-11-28 19:37:12 24 4
gpt4 key购买 nike

我有一个 ModelSerializer,但默认情况下它会序列化我模型中的所有对象。我想将此查询集限制为仅最近的 500 个(而不是全部 5000 万个)。我该怎么做?

我目前有以下内容:

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

我认为我不能只在我的 View 集中指定查询集的原因是,这实际上是另一个序列化程序的嵌套部分。

模型.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)

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

序列化器.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')

最佳答案

在您的 View 集中,您可以像下面这样指定查询集:

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

我认为您正在寻找的是 SerializerMethodField .

因此您的代码将如下所示:

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

一个问题是 SerializerMethodField 是只读的。

关于django REST 框架 - 嵌套 ModelSerializer 的有限查询集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25312987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com