关于如何处理M2M/Through模型以及它们在Django睡觉框架中的表示,我有一个问题.让我们举一个classic 的例子:

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()

序列化程序.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实例时,我成功地接收了该成员的所有字段及其组,但是我只获取了组的详细信息,没有来自成员模型的额外详细信息.

换句话说,我希望收到:

{
   'id' : 2,
   'name' : 'some member',
   'groups' : [
      {
         'id' : 55,
         'name' : 'group 1'
         'join_date' : 34151564
      },
      {
         'id' : 56,
         'name' : 'group 2'
         'join_date' : 11200299
      }
   ]
}

注意join_date.

我try 了这么多解决方案,当然包括Django Rest-Framework official page about it个,但似乎没有人给出正确而明确的答案-我需要做些什么才能包括这些额外的字段?我发现Django-Testypie更直截了当,但也有其他一些问题,我更喜欢睡觉框架.

推荐答案

那……怎么样……

在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', )

这样做的总体效果是创建一个序列化的值Groups,它的源是您想要的成员身份,然后它使用自定义的序列化程序来提取您想要显示的位.

编辑:正如@bryanph所 comments 的,在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相关问答推荐

使用FormWizard将信息从视图传递到表单

Django Prefetch上的多重过滤

如何在创建对象后立即运行一次代码?

在Django中提交表单后更改模型数据

如何组织 Django REST Framework url

在模板中调用 FileField 对象会呈现不正确的路径

超级用户在基于类的视图中进行身份验证

使用 south 重构具有继承的 Django 模型

所有子元素的Django自递归外键过滤器查询

DeleteView 中的success_message 未显示

Django Facebook Connect 应用推荐

Django 管理命令参数

Django:如何使用动态(非模型)数据预填充 FormView?

Django ModelChoiceField optgroup 标签

django-object-permissions Vs django-guardian Vs django-authority

如何在 django 中分离我的模型?

Django中的自定义排序

如何在 Django/Python 中减go 两个日期?

如何从 django 请求中获取完整的 url

我将如何package打包和销售 Django 应用程序?