如何在Django Rest中处理M2M关系

德拉格斯

让我们从django文档中使用的有关M2M关系的模型开始,该模型使用直通参数指向将充当中介的模型。

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __unicode__(self):
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, 
                                     through='Membership')

    def __unicode__(self):
        return self.name

class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)
    date_joined = models.DateField()

    class Meta:
        ordering = ['date_joined']

现在假设我要为Group模型拥有一个剩余的读写视图,该视图还包含每个组中的所有Person,并按date_joined字段排序我想获得的json序列化如下(成员仅用其id描述):

{
    "id": 1, 
    "name": "U2", 
    "members": [
       20, 
       269, 
       134, 
       12,
    ]
}

我写了一个序列化器:

class GroupSerializer(serializers.ModelSerializer):
    members = serializers.SlugRelatedField(source='membership_set', 
                                           many=True, 
                                           read_only=False,
                                           slug_field='person_id', 
                                           required=True)

    class Meta:
        model = Group
        fields = ('id', 'name', 'members')

对于读取操作,它工作良好,但不适用于写入。我应该如何定义序列化器,以便在上述定义的序列化下,它将通过以下方式进行:

  1. 创建组对象
  2. 将每个成员添加到组(通过创建成员资格对象)
阿德兰

这里可以看到,您尝试执行的操作仅适用于读取操作。正如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.

此实现假定您已使用auto_now声明了date_joined如果没有,您还应该将其作为参数传递。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在PowerPivot中创建M2M关系

来自分类Dev

django rest framework:如何显示ID以外的m2m和Foreignkey字段?

来自分类Dev

与Django在m2m关系中获取_set.all()值的更快方法

来自分类Dev

Django:删除对象中的M2M关系

来自分类Dev

在django-import-export中导入m2m关系

来自分类Dev

Django通过关系与m2m相关联

来自分类Dev

Django REST Framework,通过穿透表排序M2M序列化

来自分类Dev

如何使用中间模型批量更新Django M2M关系?

来自分类Dev

Django:在信号中获取与M2M相关的对象

来自分类Dev

模型表单中的Django M2M字段?

来自分类Dev

如何检查Django中m2m字段中值的出现?

来自分类Dev

如何使用中间表在模板中显示m2m关系?

来自分类Dev

Django,如何在没有M2M的模型中拥有数组?

来自分类Dev

Django是否真的需要M2M关系?

来自分类Dev

如何查询以从M2M关系中获取用户

来自分类Dev

在Django中以M2M关系修改对象

来自分类Dev

Django删除多个M2M关系而无循环

来自分类Dev

如何在PowerPivot中创建M2M关系

来自分类Dev

Django遍历所有M2M关系

来自分类Dev

如何在Sonata Admin中配置m2m关系?

来自分类Dev

Django如何使用User表创建M2M关系

来自分类Dev

Django:删除对象中的M2M关系

来自分类Dev

从模型中获取不在Django中的M2M关系中的对象

来自分类Dev

Django:在信号中获取与M2M相关的对象

来自分类Dev

如何计算Django中同一个模型的两个m2m关系上的相关实体数量

来自分类Dev

在两个第 3 方模型之间添加 Django M2M 关系

来自分类Dev

如何使 M2M 关系成为必填字段?

来自分类Dev

Django ManyToManyField 不保存 m2m 关系

来自分类Dev

如何删除 2 个模型之间的一种特定 M2M 关系?

Related 相关文章

热门标签

归档