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,它只会显示在该模型的管理页面中。
我在同一个应用程序中有 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,它只会显示在该模型的管理页面中。