【问题标题】:Rest Framework - Many 2 Many relation, include through model fields in APIRest Framework - Many 2 Many 关系,通过 API 中的模型字段包含
【发布时间】:2021-08-07 21:02:24
【问题描述】:

我有 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"
      },
      ...
    ]
  }
]

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

【问题讨论】:

    标签: django django-rest-framework django-2.x


    【解决方案1】:

    试试:

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

    【讨论】:

    • 对我不起作用。我明白了:尝试在序列化程序 GroupPersonSerializer 上获取字段 group 的值时出现 AttributeError。序列化程序字段可能命名不正确,并且与 Person 实例上的任何属性或键都不匹配。原始异常文本为:“Person”对象没有“组”属性。
    • 你现在可以试试。
    【解决方案2】:

    而不是使用

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

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

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

    【讨论】:

    • 我不想序列化Group。这不会给我GroupPerson 中的rank 字段。我想序列化GroupPerson。但是如果我使用 GroupPersonSerializer,我会收到错误 Got AttributeError when attempting to get a value for field...
    • @Sourabh OIC ...您需要组的 ID,然后是排名。可能使用GroupPersonSerializer 而不是GroupSerializer,就像我在回答中所做的那样。
    • 对我不起作用。我明白了:尝试在序列化程序GroupPersonSerializer 上获取字段group 的值时出现属性错误。序列化程序字段可能命名不正确,并且与 Person 实例上的任何属性或键都不匹配。原始异常文本是:“Person”对象没有“组”属性。
    • @Sourabh 我建议您发布一个新问题以显示您当前的代码。
    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2021-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    相关资源
    最近更新 更多