在Django Rest Framework的响应中包括中介(通过模型)

我有一个关于通过模型处理m2m /及其在django rest框架中的演示的问题。让我们举一个经典的例子:

models.py:

from django.db import models

class 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

回到顶部