我在同一个应用程序中有2个模型相互引用。一个作为外键,另一个作为多个键。
class VideoEmbed(models.Model):
person = models.ForeignKey('Person')
title = models.CharField(max_length=250)
video = EmbedVideoField()
class Person(models.Model):
name = models.CharField(max_length=200)
born = models.DateField(blank=True, null=True)
video = models.ManyToManyField(VideoEmbed, related_name='video_embed', null=True, blank=True)
我想这样做的原因是将Person与其相关视频相关联,因为一个人可能有很多视频。现在在django管理站点中,videoembed模型将针对每个人录制视频,因此这些将分别显示在Person的每个实例中。但是在django站点中,我必须从多个选择框中选择每个视频。许多关系领域。
我希望此字段仅显示通过videoembed模型链接到此实例的视频,而不是所有添加的视频。有没有办法做到这一点?如果没有,那么我可以在本节中看到2个字段而不是一个,这样我就可以选择链接到Person实例的视频。
答案 0 :(得分:1)
我认为这是对how ManyToMany
relationships work的误解。定义ManyToMany时,反向关系包含在" far side"关系。
例如,考虑代码的精简版本:
class Video(models.Model):
title = models.CharField(max_length=250)
class Person(models.Model):
name = models.CharField(max_length=200)
videos = models.ManyToManyField(VideoEmbed, related_name='people', null=True, blank=True)
在此,person_object.videos
为一个人提供了一组视频,显而易见的是,Django还在Video
上设置了可访问的video_object.people
的反向关系}这是一组通过Person
关系引用特定Video
的所有ManyToMany
个对象。
此关系默认为model_name
和_set
,因此对于您的关系,默认值为person_set
,但在related_name
中设置ManytoManyField
参数它会覆盖这个。
向ForeignKey
模型添加Video
会创建and entirely separate and independent relationship
。
考虑这个简单的模型,Video
现在有一个作者,人们被标记在视频中(实际上他们可能都会看到视频,但我们正在展示ForeignKey和ManyToMany是如何独立的,以及属性名称的良好语义值:
class Video(models.Model):
title = models.CharField(max_length=250)
author = models.ForeignKey('Person')
class Person(models.Model):
name = models.CharField(max_length=200)
videos_person_tagged_in = models.ManyToManyField(VideoEmbed, related_name='tagged_people', null=True, blank=True)
此处,设置video_object.author
不会更改视频的tagged_people
,也不会为某个人设置videos_person_tagged_in
更改作者。
至于reverse relation for a ManyToMany
isn't showing up in Django admin, this is a known issue requires custom forms to work around的原因。主要是因为您在一个项目上定义了ManyToMany,它只会显示在该模型管理页面中。