在Django Rest Framework的响应中包括中介(通过模型)
我有一个关于通过模型处理m2m /及其在django rest框架中的演示的问题。让我们举一个经典的例子:
models.py:
from django.db import modelsclass Member(models.Model):
name = models.CharField(max_length = 20)
groups = models.ManyToManyField('Group', through = 'Membership')
class Group(models.Model):
name = models.CharField(max_length = 20)
class Membership(models.Model):
member = models.ForeignKey('Member')
group = models.ForeignKey('Group')
join_date = models.DateTimeField()
serializers.py:
imports...class MemberSerializer(ModelSerializer):
class Meta:
model = Member
class GroupSerializer(ModelSerializer):
class Meta:
model = Group
views.py:
imports...class MemberViewSet(ModelViewSet):
queryset = Member.objects.all()
serializer_class = MemberSerializer
class GroupViewSet(ModelViewSet):
queryset = Group.objects.all()
serializer_class = GroupSerializer
在获取Member的实例时,我成功地接收了成员的所有字段及其组-但是,我仅获得组的详细信息,而没有来自Membership模型的其他详细信息。
换句话说,我希望收到:
{ 'id' : 2,
'name' : 'some member',
'groups' : [
{
'id' : 55,
'name' : 'group 1'
'join_date' : 34151564
},
{
'id' : 56,
'name' : 'group 2'
'join_date' : 11200299
}
]
}
注意join_date。
我已经尝试了很多解决方案,当然包括有关它的Django Rest-Framework官方页面,似乎没有人给出正确的简单答案-我需要怎么做才能包括这些额外的字段?我发现使用django-tastypie更加简单明了,但还有其他一些问题,并且更喜欢其余框架。
回答:
在你的MemberSerializer上,在其上定义一个字段,如下所示:
groups = MembershipSerializer(source='membership_set', many=True)
然后在会员序列化器上可以创建以下代码:
class MembershipSerializer(serializers.HyperlinkedModelSerializer): id = serializers.Field(source='group.id')
name = serializers.Field(source='group.name')
class Meta:
model = Membership
fields = ('id', 'name', 'join_date', )
这具有创建序列化值,组的总体效果,该序列化组具有所需的成员身份作为源,然后使用自定义序列化程序提取要显示的位。
编辑:由@bryanph评论,在DRF 3.0中serializers.field
被重命名为serializers.ReadOnlyField
,因此应显示为:
class MembershipSerializer(serializers.HyperlinkedModelSerializer): id = serializers.ReadOnlyField(source='group.id')
name = serializers.ReadOnlyField(source='group.name')
class Meta:
model = Membership
fields = ('id', 'name', 'join_date', )
适用于任何现代实施
以上是 在Django Rest Framework的响应中包括中介(通过模型) 的全部内容, 来源链接: utcz.com/qa/401438.html