django admin - 模型交叉引用 - 外部和多对多关系 - 在管理中显示

django admin - model cross reference - both foreign and many to many relationship - displaying in admin

我在同一个应用程序中有 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)

我之所以要这样做是为了link 一个人可以拥有很多视频。现在在 django 管理站点中,videoembed 模型将针对每个人录制视频,因此这些将显示在 django 站点的每个人 respectively.However 实例中,我必须 select 每个视频来自select 多对多关系字段中的框。

我希望此字段仅显示通过视频嵌入模型 linked 到此实例的视频,而不是所有添加的视频。有没有办法做到这一点?如果没有,那么我应该能够在本节中看到 2 个字段而不是一个字段,这样我就可以 select 将 linked 到 Person 实例的视频。

我认为这是对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 这是通过 ManyToMany 关系引用特定 Video 的所有 Person 对象的集合。

此关系默认为 model_name_set,因此对于您的默认关系为 person_set,但通过在 [=23] 中设置 related_name 参数=] 它覆盖了这个。

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 that requires custom forms to work around。主要是因为您在一个项目上定义了 ManyToMany,它只会显示在该模型的管理页面中。