Django rest framework 如何在django rest中处理M2M关系

Django rest framework 如何在django rest中处理M2M关系,django-rest-framework,Django Rest Framework,让我们从django文档中使用的关于M2M关系的模型开始,M2M关系使用through参数指向将充当中介的模型 班级人员(models.Model): name=models.CharField(最大长度=128) def ___; unicode(自): 返回self.name 类别组(models.Model): name=models.CharField(最大长度=128) 成员=模型.ManyToManyField(个人, 通过会员资格) def ___; unicode(自): 返回s

让我们从django文档中使用的关于M2M关系的模型开始,M2M关系使用through参数指向将充当中介的模型

班级人员(models.Model):
name=models.CharField(最大长度=128)
def ___; unicode(自):
返回self.name
类别组(models.Model):
name=models.CharField(最大长度=128)
成员=模型.ManyToManyField(个人,
通过会员资格)
def ___; unicode(自):
返回self.name
班级成员资格(models.Model):
person=型号。外键(person)
组=型号。外键(组)
date\u joined=models.DateField()
类元:
订购=[“加入日期”]
假设现在我想为组模型创建一个rest读写视图,其中还包含每个组中的所有人员,按日期排序\u加入字段。我希望获得的json序列化如下(仅使用其id描述成员):

{
“id”:1,
“名称”:“U2”,
“成员”:[
20, 
269, 
134, 
12,
]
}
我编写了一个序列化程序:

class GroupSerializer(serializers.ModelSerializer):
members=serializers.SlugRelatedField(source='membership\u set',
多=真,
只读=错误,
slug\u field='person\u id',
必需=真)
类元:
模型=组
字段=('id','name','members')
对于读操作,它工作得很好,但对于写操作,它却不起作用。我应该如何定义序列化程序,以便在给定上述定义的序列化的情况下,它将通过以下方式继续进行:

  • 创建组对象
  • 将每个成员添加到组中(通过创建成员身份对象)
  • 从中可以看出,您尝试执行的操作仅适用于读取操作。正如DRF的创造者汤姆·克里斯蒂(Tom Christie)在评论中所说,这是DRF的一个常见问题

    此外,对于所需的JSON序列化,建议使用PK相关字段,如图所示,尽管这无助于创建组对象和添加成员。你必须自己编写代码

    希望这有帮助

    编辑

    通过创建成员身份将每个人添加到组的代码片段:

    def post_save(self, obj, created=False):
        # obj represents the Group object
        if created:
            # Test to see if the Group was successfully created
            members = self.request.DATA.get('members', None)
            if members not None:
                for id in members:
                    person = Person.objects.get(id=id)
                    membership, m_created = Membership.objects.get_or_create(person=person, group=obj)
                    # Here you can use m_created to see if the membership already existed and to do whatever else you need.
    

    此实现假设您现在已声明您的日期与自动日期。如果没有,您也应该将其作为参数传递。

    感谢您给我的明确答案,以及文档相关部分的链接或作者关于这一点的答案。遗憾的是,我试图做的事情没有得到框架的太多支持。你能不能建议我一个方法,通过自己写代码来完成这项任务?正确的方法是什么?再次感谢你!我很高兴我能帮上忙:)至于创建部分,你可以在两个地方做:post/create方法或post\u save方法。我建议在post_save中完成,因为这意味着您允许框架创建组对象,剩下要做的就是添加成员。我将用一个小的代码片段来编辑我的答案,了解如何使用这个方法。非常感谢您,非常感谢您的支持!