Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Rest框架嵌套序列化程序未显示相关数据_Python_Django_Django Rest Framework - Fatal编程技术网

Python Django Rest框架嵌套序列化程序未显示相关数据

Python Django Rest框架嵌套序列化程序未显示相关数据,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个使用Django Rest框架的基本设置。我有两个模型和一个嵌套序列化程序设置: # 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):

我有一个使用Django Rest框架的基本设置。我有两个模型和一个嵌套序列化程序设置:

# 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
中的任何项都没有
.group
属性,这就是结果为空的原因。默认情况下,Django会创建一个名为
组集
计划
外键的反向关系(除非您不通过
相关名称
重命名它)(这意味着
queryset
中的每个
plan
项都有一个
group\u set
属性,该属性是一个包含此
plan
的所有组的查询集)。您可以使用此属性来获得适当的序列化。这意味着要更改:

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

    class Meta:
        model = Plan
        fields = ('name', 'group_set')
如果你真的想坚持使用
group
(顺便说一句,这对于组列表来说是一个非常糟糕的名字)。你可以使用
prefetch\u related
这样做:

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

这样,每个
计划
项都将有一个
属性-一个
查询集
包含此
计划
的所有组

永远不要忘记为外键提供相关名称

在模型中

plan = modles.ForeignKey(Plan, related_name="plan")
在序列化程序中

plan = PlanSerializers(many = True, read_only = True)

感谢您的帮助。我改为
group\u set
,因为我不喜欢这个名字,这就解决了它。我还将研究将名字从
group
改为
categories
或类似的东西。您可以在通过
相关的\u name
定义FK时更改默认的xxx\u set符号,例如
plan=models.ForeignKey('plan',related_name='groups'))
。现在您将不再使用
组集
属性,而是使用
。这确实帮助我找到了我自己问题的原因。我建议将您最后的注释添加到您的答案中,因为在您的模型中有合适的相关名称,序列化程序可以使用这些名称似乎是一个更完整的答案。在我看来,Todor的方法是正确的,或者至少看起来比公认的答案更清晰。谢谢你,托多,关于DRF中自定义字段的命名有点含糊不清。我想我可以自由命名字段:)