django 管理表单上的大型多对多关系
Posted
技术标签:
【中文标题】django 管理表单上的大型多对多关系【英文标题】:Large ManyToMany relations on django admin form 【发布时间】:2016-01-06 22:33:31 【问题描述】:所以,我有以下型号:
class Band(models.Model):
name = models.CharField(max_length=50)
class Contract(models.Model):
band = models.ForeignKey(Band)
when = models.DateTimeField(auto_now_add=True)
salary = models.IntegerField()
class Musician(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
instrument = models.CharField(max_length=100)
bands = models.ManyToManyField(Band, through=Contract)
class Album(models.Model):
artist = models.ForeignKey(Musician)
name = models.CharField(max_length=100)
release_date = models.DateField()
num_stars = models.IntegerField()
所以,我想在管理页面上公开它。到目前为止,一切顺利。
请注意,我们这里的音乐家不断进出乐队。有人说其中一位在他的一生中甚至已经在超过 200 万支乐队中演出。我不知道,也许乐队是 Whitesnake、Metallica 之类的。
我们应该如何在 Django 管理页面上做到这一点?
我尝试使用raw_id_fields
,除了我不喜欢这种效果之外,它效果不佳。加载花费了很多时间,并且没有让我添加更多的 id。很奇怪。
我使用admin.StackedInline
没有运气,因为它会尝试加载每个合同,而这将只需要 2000 年。
当 Musician 与 Band 有直接关系时,它与 this library 合作得很好。但现在这种关系不是直接的。看起来自动完成不支持它(反正它变慢了)。
所以,关于这一切,我请教各位 SO 成员。 最好的方法是什么?它是自动完成的吗?一定有人遇到过这个问题!
提前致谢。
【问题讨论】:
不确定它在处理大量记录时的表现如何,但您是否尝试过filter_horzontal 或filter_vertical? 如何处理具有 through 属性的多对多关系? 这里有一些可能的解决方案:***.com/questions/10110606/… 【参考方案1】:为避免加载管理页面中的每个频段,请使用 autocomplete_fields
Django doc。
只需在您的 admin.py
中使用它即可。
autocomplete_fields = ('bands',)
然后不会将任何波段从 DB 拉到前面,但您可以通过 Select2 搜索字段选择它,并将其打印为“标签”。
【讨论】:
这并不像宣传的那样工作:) 自动完成小部件将加载所有条目并在管理页面加载时填充整个列表(刚刚尝试过)。只有当你的关系非常稀疏时,它才在这种情况下正常工作,比如一些条目被点亮。如果你有(就像我一样)成千上万的关系被点亮,它就行不通了,它会给你一个英里高的网页...... 好的,这很奇怪,因为我们目前有数千个关系,我们使用autocomplete_fields
和 raw_id_fields
没有任何问题。这对我们来说是救命稻草。
我通过将 5000 个用户添加到 many2many 字段来测试它,并将其设置为只读或自动完成,在这两种情况下,django 管理页面都试图同时显示所有 5000 个(在我们的生产中env 我们有 100000 个点亮的条目,所以它会变得完全疯狂)。我希望有一种方法可以让它分页(就像 autocomplete_fields 通常在它获取 unlit 条目时所做的那样)。以上是关于django 管理表单上的大型多对多关系的主要内容,如果未能解决你的问题,请参考以下文章