让我们从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')
对于读取操作,它工作良好,但不适用于写入。我应该如何定义序列化器,以便在上述定义的序列化下,它将通过以下方式进行:
从这里可以看到,您尝试执行的操作仅适用于读取操作。正如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] 删除。
我来说两句