Django Rest Framework 嵌套序列化器不显示相关数据

2024-04-29

我使用 Django Rest Framework 进行了基本设置。我有两个模型和一个嵌套序列化器设置:

# models.py

from django.db import models

class Plan(models.Model):
    name = models.CharField(max_length='100')

    def __unicode__(self):
        return u'%s' % (self.name)

class Group(models.Model):
    plan = models.ForeignKey('plan')
    name = models.CharField(max_length='50')
    weight = models.SmallIntegerField()

    def __unicode__(self):
        return u'%s - %s' % (self.name, self.plan.name)


# serializer.py

from plans.models import Plan, Group
from rest_framework import serializers

class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = ('name', 'weight')

class PlanSerializer(serializers.ModelSerializer):
    group = GroupSerializer(many=True, read_only=True)

    class Meta:
        model = Plan
        fields = ('name', 'group')


# views.py

from rest_framework import viewsets

from plans.models import Plan
from plans.serializers import PlanSerializer

class PlanViewSet(viewsets.ModelViewSet):
    queryset = Plan.objects.all()
    serializer_class = PlanSerializer

当我在 Django 的 Shell 中查看序列化器关系时,它正确显示了该关系:

PlanSerializer():
name = CharField(max_length='100')
group = GroupSerializer(many=True, read_only=True):
    name = CharField(max_length='50')
    weight = IntegerField()

我最终通过 cURL 返回的是:

[
    {
        name: Test Plan
    }
]

我期望得到的回报是:

[
    {
        name: Test Plan,
        group: [
                {
                    name: Test Group,
                    weight: 1
                }
        ] 
    }
]

没有嵌套数据通过。我对这里没有正确设置的内容感到困惑。有人能指出我正确的方向吗?


问题来自于你的queryset: queryset = Plan.objects.all()。此项目中没有任何项目queryset has .group属性这就是你的结果为空的原因。默认情况下,Django 创建一个反向关系plan外键称为group_set(除非你不通过重命名它related_name) (这意味着每个plan中的项目queryset have a group_set属性,它是包含此所有组的查询集plan)。您可以使用此属性来获得正确的序列化。这意味着要改变:

class PlanSerializer(serializers.ModelSerializer):
    group_set = GroupSerializer(many=True, read_only=True)

    class Meta:
        model = Plan
        fields = ('name', 'group_set')

如果你真的想坚持group (顺便说一句,对于组列表来说,这是一个非常糟糕的名称)。你可以用它来破解它prefetch_related像这样:

queryset = Plan.objects.prefetch_related('group_set', to_attr='group')

这样每plan项目将有一个group属性-aqueryset包含此的所有组plan.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django Rest Framework 嵌套序列化器不显示相关数据 的相关文章

随机推荐