0

我有 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 go get 一组返回

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

我如何得到类似以下的响应:

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

即,我想 GET/POST/PATCH通过关系的所有字段

4

2 回答 2

0

尝试:

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"]
于 2021-05-18T15:43:48.840 回答
0

而不是使用

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

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

这将允许 DRF 序列化为groups嵌套对象列表。有关更多详细信息,请查看嵌套关系的文档

于 2021-05-18T15:30:48.043 回答