django REST框架 - 嵌套ModelSerializer的有限查询器? [英] django REST framework - limited queryset for nested ModelSerializer?

查看:112
本文介绍了django REST框架 - 嵌套ModelSerializer的有限查询器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个ModelSerializer,但是默认情况下它将序列化模型中的所有对象。我想限制这个查询器只有最近的500(相对于所有5000万)。我如何做到这一点?



我目前是以下内容:

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

我不认为我可以在我的观点中指定查询集的原因是这实际上是另一个序列化程序的嵌套部分。



模型。 py



  class Container(models.Model):
size = models.CharField(max_length = 20)
shape = models.CharField(max_length = 20)

类项目(models.Model):
container = models.ForeignKey(Container,related_name ='items')
name = models.CharField(max_length = 20)
color = models.CharField(max_length = 20)



< h2> views.py

  class ContainerViewSet(viewsets.ModelViewSet):
queryset = Container.objects.all() #只有少量容器
serializer_class = ContainerSerializer



serializers.py



  class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields =('name','color')

class ContainerSerializer(serializers.ModelSerializer):
items = ItemSerializer(many = True)每个容器数百万项
class Meta:
model = Container
fields =('大小','形状','项目')


解决方案

在您的视图集中,您可以指定查询集,如下所示:

  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



$ b $ getBuffer(container = container)[:500 ]#无论你的查询可能是
serializer = ItemSerializer(instance = items,many = True)
return serializer.data

一个可以看出的是,$ code> SerializerMethodField 是只读的。


I have a ModelSerializer, but by default it serializes all the objects in my model. I would like to limit this queryset to only the most recent 500 (as opposed to all 50 million). How do I do this?

What I have currently is the following:

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

The reason I don't think I can just specify the queryset in my viewset is that this is in fact the nested portion of another serializer.

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

解决方案

In your View Set you may specify the queryset like follows:

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

I think what you are looking for is the SerializerMethodField.

So your code would look as follows:

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

The one catch is that the SerializerMethodField is read only.

这篇关于django REST框架 - 嵌套ModelSerializer的有限查询器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆