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_fieldsraw_id_fields 没有任何问题。这对我们来说是救命稻草。 我通过将 5000 个用户添加到 many2many 字段来测试它,并将其设置为只读或自动完成,在这两种情况下,django 管理页面都试图同时显示所有 5000 个(在我们的生产中env 我们有 100000 个点亮的条目,所以它会变得完全疯狂)。我希望有一种方法可以让它分页(就像 autocomplete_fields 通常在它获取 unlit 条目时所做的那样)。

以上是关于django 管理表单上的大型多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Django内联表单集通过另一个模型在多对多关系中过滤

iOS 上的解析平台:大型多对多的关系、联接或数组?

在 Django admin 中添加内联多对多对象

父/子表单上的多对多关系限制了数据输入

多对多字段的 Django 表单上的逗号分隔文本而不是多项选择

Django - 使用表单集在不通过表的情况下建立 2 个模型之间的多对多关系