嵌套的序列化器“直通模型"(Through model)在Django Rest框架中 [英] Nested serializer "Through model" in Django Rest Framework

查看:94
本文介绍了嵌套的序列化器“直通模型"(Through model)在Django Rest框架中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在序列化中间枢轴"模型并将其附加到Django Rest Framework中的多对多"关系中的每个项目时遇到困难.

I am having difficulty serializing an intermediary "pivot" model and attach to each item in an Many-to-many relation in Django Rest Framework.

示例:

models.py:

models.py:

class Member(models.Model):
    name = models.CharField(max_length = 20)
    groups = models.ManyToManyField('Group', through='Membership')

class Group(models.Model):
    name = models.CharField(max_length = 20)

class Membership(models.Model):
    member = models.ForeignKey('Member')
    group = models.ForeignKey('Group')
    join_date = models.DateTimeField()

serializers.py:

serializers.py:

class MemberSerializer(ModelSerializer):
    class Meta:
        model = Member

class GroupSerializer(ModelSerializer):
    class Meta:
        model = Group

class MembershipSerializer(ModelSerializer):
    class Meta:
        model = Membership

我试图遵循答案:在Django Rest Framework的响应中包括中介(通过模型)

但这不是我真正需要的

我需要生成以下输出

{
  "id": 1,
  "name": "Paul McCartney",
  "groups": [
    {
      "id": 3,
      "name": "Beatles",
      "membership": {
        "id": 2,
        "member_id": 1,
        "group_id": 3,
        "join_date": "2018-08-08T13:43:45-0300"
      }
    }
  ]
}

在此输出中,我将为组中的每个项目返回相关的通过模型".

In this output I'm returning the related "Through Model" for each item in groups.

如何以这种方式生成序列化模型?

How can I generate serialize models in this way?

推荐答案

根据您想要显示输出的方式,建议您将模型更改为:

Based on the way you would like to show your output, I suggest you change your models to:

class Group(models.Model):
    name = models.CharField(max_length=20)
    members = models.ManyToManyField(
        'Membership',
        related_name='groups',
        related_query_name='groups',
    )


class Member(models.Model):
    name = models.CharField(max_length=20)


class Membership(models.Model):
    group = models.ForeignKey(
        'Group',
        related_name='membership',
        related_query_name='memberships',
    )
    join_date = models.DateTimeField()

Group 模型和 Member 模型是 ManytoMany 的方式,让您在 Group 模型.将其以序列化方式输出将是最简单的. related_name related_query_name 用于进行序列化并指向嵌套关系.

How Group model and Member model are ManytoMany, does not have a problem you let the relationship in Group model. It will be the easiest to output it in serialize. related_name and related_query_name are used to make the serialization and point the nested relation.

最后,您的序列化可能是这样的(我以create方法为例):

And finally, your serialize could be like this (I exemplified it with a create method):

class MembershipSerializer(ModelSerializer):
    class Meta:
        fields = ("id", "join_date",)


class GroupSerializer(ModelSerializer):
    memberships = MembershipSerializer(many=True)

    class Meta:
        model = Group
        fields = ("id", "name", "memberships",)


class MemberSerializer(ModelSerializer):
    groups = GroupSerializer(many=True)

    class Meta:
        model = Member
        fields = ("id", "name", "groups")

    def create(self):
        groups_data = validated_data.pop('groups')
        member = Member.objects.create(**validated_data)
        for group in groups_data:
            memberships_data = group.pop('memberships')
            Group.objects.create(member=member, **group)
            for memberhip in memberships:
                Membership.objects.create(group=group, **memberships)

输出将是:

{
  "id": 1,
  "name": "Paul McCartney",
  "groups": [
    {
      "id": 3,
      "name": "Beatles",
      "memberships": [
        {
          "id": 2,
          "join_date": "2018-08-08T13:43:45-0300"
        }
      ]
    }
  ]
}

在此输出中,我不是在嵌套"父ID,但您也可以这样做,只需将其声明为fields属性即可.

In this output, I am not "nesting" the parent id but you can make it too, just declare into fields attributes.

这篇关于嵌套的序列化器“直通模型"(Through model)在Django Rest框架中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆