簡體   English   中英

Django Rest Framework嵌套序列化程序不顯示相關數據

[英]Django Rest Framework nested serializer not showing related data

我有一個使用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
                }
        ] 
    }
]

沒有嵌套數據通過。 因為我在這里沒有正確設置,我很遺憾。 誰能指出我正確的方向?

問題來自您的querysetqueryset = Plan.objects.all() 在這個項目中沒有queryset都有.group屬性,這就是為什么你的結果是空的。 默認情況下的Django創建的反向關系plan ForeignKey的所謂group_set (除非你不通過將其重命名related_name )(這意味着每一個plan中的項目queryset有一個group_set屬性,是包含這個的所有組一個QuerySet 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屬性-一個queryset包含所有組此plan

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM