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

我目前的情况如下:

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

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

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)

意见.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')

推荐答案

在视图集中,可以按如下方式指定查询集:

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相关问答推荐

Django www.example.com从常量列表中删除值

创建用户/将用户登录到客户端服务器的标准OAuth/OIDC流程是什么?

如何将Django项目连接到容器化的PostgreSQL数据库?

Templatetag 在 Django 4.2 模板 IF 条件中不起作用

try 获取静态文件路径时 Django 给出错误

Django:获取每组最新的N条记录

Django 如何知道我的数据库的路径?

Django:想要将一个空字段显示为空白而不是显示无

断开模型的信号并在 django 中重新连接

在 Django 中提供大文件(高负载)

在 django 模板中访问元组

使用 Gunicorn 运行 Django - 最佳实践

Django urls 直接到 html 模板

在 django admin 中链接到外键对象

在 Django shell 启动时自动导入模型

Django 1.7 - 如何 suppress (1_6.W001)某些元素单元测试可能无法按预期执行.?

Django模板转换为字符串

用于创建和更新的基于 Django 类的视图

APIView 类和视图集类之间的区别?

如何在 django 模板中呈现有序字典?