我有一个关于通过模型处理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,因此应显示为:
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', )
适用于任何现代实施