gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:17:02 26 4
gpt4 key购买 nike

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

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']

假设现在我想休息一下 读写组模型的 View ,其中还包含每个组中的所有人员, 按 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')

虽然对于读取操作它运行良好,但它不适用于写入。我应该如何定义序列化程序,以便根据上面定义的序列化,它将通过以下方式进行:
  • 创建组对象
  • 将每个成员添加到组中(通过创建 Membership 对象)
  • 最佳答案

    来自 here您可以看到您尝试执行的操作仅适用于读取操作。正如其创建者 Tom Christie 在 this 中所说,这是 DRF 的常见问题。评论。

    另外,对于你想要的JSON序列化,建议使用PK相关字段,如图here ,尽管这无助于创建 Group 对象和添加成员。您必须自己编写该代码。

    希望这可以帮助。

    编辑

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

    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。如果没有,您还应该将其作为参数传入。

    关于django-rest-framework - 如何在 django-rest 中处理 M2M 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20501644/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com