[英]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
}
]
}
]
沒有嵌套數據通過。 因為我在這里沒有正確設置,我很遺憾。 誰能指出我正確的方向?
問題來自您的queryset
: queryset = 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.