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