Django rest framework Django Rest框架获得API中显示的多对多关系

Django rest framework Django Rest框架获得API中显示的多对多关系,django-rest-framework,Django Rest Framework,我的小播客后端有一些模型,其中一个是插曲。现在有两个新的嘉宾(嘉宾)和主题(主题)——这两个节目都有很多地方要插播。这基本上是按照管理员的预期工作的。现在我需要把它带到API中 每集的详细序列化程序/视图已经有一些其他相关数据(到目前为止没有多对多数据)。我也检查了一下,但仍然无法正常工作,我想我可能会错过一些东西 以下是来宾示例的精髓,以保持其紧凑性,主题完全相同: 情节模式: class Episode(models.Model): number = models.

我的小播客后端有一些模型,其中一个是插曲。现在有两个新的嘉宾(嘉宾)和主题(主题)——这两个节目都有很多地方要插播。这基本上是按照管理员的预期工作的。现在我需要把它带到API中

每集的详细序列化程序/视图已经有一些其他相关数据(到目前为止没有多对多数据)。我也检查了一下,但仍然无法正常工作,我想我可能会错过一些东西

以下是来宾示例的精髓,以保持其紧凑性,主题完全相同:

情节模式:

class Episode(models.Model):
    number          = models.CharField(max_length=10, blank=False)
    title           = models.CharField(max_length=100, blank=False)
    show            = models.ForeignKey(Show, on_delete=models.PROTECT)
    created_at      = models.DateTimeField(auto_now=False)
    published_at    = models.DateTimeField(auto_now=False)
    updated_at      = models.DateTimeField(auto_now=False)
    cover_image     = models.URLField(null=True)

    def __str__(self):
        return self.title
嘉宾模式:

class Guest(models.Model):
    episodes        = models.ManyToManyField(Episode)
    name            = models.CharField(max_length=100, blank=False)
    twitter         = models.CharField(max_length=20, null=True)

    def __str__(self):
        return self.name
序列化程序:

class GuestSerializer(serializers.ModelSerializer):
    class Meta:
        model = Guest
        fields = ('name',)
应在其中显示的情节序列化程序:

class EpisodeDetailSerializer(serializers.ModelSerializer):
    ...
    guest = GuestSerializer(many=True, read_only=True)
    topic = TopicSerializer(many=True, read_only=True)

    class Meta:
        model = Episode
        fields = (..., 'guest', 'topic')
        depth = 1

我已经为来宾和主题添加了一些数据,但我无法将它们显示在API上。我还尝试了“Guest.scents.through”,就像我在内联管理类的管理上有它一样,但这没有改变任何东西。

你的
剧集
模型与你的
Guest
主题
模型没有任何前向关系。因此,您的
剧集
序列化程序应该尝试序列化
来宾集
主题集
,而不是
来宾集
主题集

如果为这些M2M字段指定相关名称,则可以在此处自定义命名约定。现在你有这个:

class Guest(models.Model):
    episodes = models.ManyToManyField(Episode)
    ...
这意味着,要访问与名为
ep
的给定
插曲相关的所有
guest
,反向查找将是
ep.guest\u set.all()
。定义一个相关名称,您可以随意调用中间术语:

class Guest(models.Model):
    episodes = models.ManyToManyField(Episode, related_name='guests')
    ...

有了它,您可以使用
ep.guests.all()
,并且您可以更新
剧集
序列化程序来查找
来宾
,而不是
来宾集

您的
剧集
模特与您的
嘉宾
主题
模特没有任何正向关系。因此,您的
剧集
序列化程序应该尝试序列化
来宾集
主题集
,而不是
来宾集
主题集

如果为这些M2M字段指定相关名称,则可以在此处自定义命名约定。现在你有这个:

class Guest(models.Model):
    episodes = models.ManyToManyField(Episode)
    ...
这意味着,要访问与名为
ep
的给定
插曲相关的所有
guest
,反向查找将是
ep.guest\u set.all()
。定义一个相关名称,您可以随意调用中间术语:

class Guest(models.Model):
    episodes = models.ManyToManyField(Episode, related_name='guests')
    ...

有了它,您可以使用
ep.guests.all()
,并且您可以更新
剧集
序列化程序来查找
来宾
,而不是
来宾集

你能不能也发布你的剧集模型,因为这是你上一个连载器的基础?您是否为这些m2m关系设置了相关的名称?@souldeux我刚刚添加了插曲模型。不,到目前为止我没有设置相关的名称。我读到它们是可选的?你能不能也发布你的插曲模型,因为这是你上一个连载器的基础?您是否为这些m2m关系设置了相关的名称?@souldeux我刚刚添加了插曲模型。不,到目前为止我没有设置相关的名称。我读到它们是可选的?