使用中间ManyToMany模型时序列化(写入)

时间:2018-04-11 13:16:31

标签: django python-3.x serialization django-rest-framework

使用标准 ManyToMany模型时,

可以读/写。(无额外字段)。
可以阅读使用中间 ManyToMany模型(带额外字段)。
使用中间 ManyToMany模型(带有额外字段)时,无法编写

由于DRF缺乏对可写嵌套字段的支持而失败。

但是,DRF确实支持编写标准ManyToMany模型的嵌套pk;额外的字段不应该对操作添加歧义。

使用标准时,

读/写:ManyToMany模型的工作原理如下:

models.py

class Person(models.Model):
    person = models.CharField(max_length=64)

class Group(models.Model):
    group = models.CharField(max_length=64)
    persons = models.ManyToManyField(Person)

serializers.py

class GroupSerializer(serializers.ModelSerializer):
    persons = serializers.PrimaryKeyRelatedField(many=True, queryset=Person.objects.all())
    class Meta:
        model = Group
        fields = ('id', 'group', 'persons')
使用中间时,

阅读:ManyToMany模型的工作原理如下:

models.py

class Person(models.Model):
    person = models.CharField(max_length=64)

class Group(models.Model):
    group = models.CharField(max_length=64)
    persons = models.ManyToManyField(Person, through='Membership')

class Membership
    date = DateField()
    group = models.ForeignKey(Person, on_delete=models.CASCADE)
    person = models.ForeignKey(Group, on_delete=models.CASCADE)

serializers.py

class MembershipSerializer(serializers.ModelSerializer):
    class Meta:
        model = Membership
        fields = ('id', 'date', 'group', 'person')

class GroupSerializer(serializers.ModelSerializer):
    memberships = MembershipSerializer(source='membership_set', many=True)
    class Meta:
        model = Group
        fields = ('id', 'group', 'memberships')

使用中间 ManyToMany模型时的解决方案是什么?
寻找我错过的明显事物;我宁愿不实现自定义的create()和update()方法。

0 个答案:

没有答案