Rest Framework - Many 2 Many 关系,包括通过 API 中的模型字段

问题描述

我有 2 个模型通过 M2M 模型连接:

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

class Group(models.Model):
    name = models.CharField(max_length=100)
    members = models.ManyToManyField(Person,through='GroupPerson',related_name='groups')

class GroupPerson(models.Model):
    group = models.ForeignKey(Group,on_delete=models.CASCADE)
    person = models.ForeignKey(Person,on_delete=models.CASCADE)
    rank = models.CharField(max_length=100',default='New')

和序列化器

class GroupPersonSerializer(serializers.ModelSerializer):
    class Meta:
        model = GroupPerson
        fields = '__all__'

class GroupSerializer(serializers.ModelSerializer):
    members = serializers.PrimaryKeyRelatedField(many=True,queryset=Person.objects.all())

    class Meta:
        model = Group
        fields = '__all__'


class PersonSerializer(serializers.ModelSerializer):
    groups = serializers.PrimaryKeyRelatedField(many=True,queryset=Group.objects.all())

    class Meta:
        model = Person
        fields = '__all__'

和 API 去获取一组返回

[
  {
    "name": "...","members": [ 1,... ]
  }
]

我如何获得类似以下的回复

[
  {
    "name": "...","members": [
      {
        "group_id": 1,"person_id": 1,"rank": "New"
      },...
    ]
  }
]

即,我想对 through 关系的所有字段进行 GET/POST/PATCH

解决方法

代替使用

    groups = serializers.PrimaryKeyRelatedField(many=True,queryset=Group.objects.all())

    groups = GroupSerializer(many=True,read_only=True)

这将允许 DRF 将 groups 序列化为嵌套对象列表。如需了解详情,请查看 the documentation for Nested Relationships

,

试试:

class PersonSerializer(serializers.ModelSerializer):
    groups = serializers.SerializerMethodField()

    def get_groups(self,person):
        queryset = GroupPerson.objects.filter(person=person)
        return GroupPersonSerializer(queryset,many=True).data

    class Meta:
        model = Person
        fields = ["id","name","groups"]