django 管理表单上的大型多对多关系

Pat*_*sut 9 python django many-to-many django-admin

所以,我有以下模型:

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()
Run Code Online (Sandbox Code Playgroud)

所以,我想在管理页面上公开这一点。到目前为止,一切都很好。

请注意,我们这里的音乐家不断地在乐队中进进出出。有人说,其中一位一生中曾参加过超过 200 万支乐队。我不知道,也许这些乐队是 Whitesnake、Metallica 之类的。

我们应该如何在 Django 管理页面上做到这一点?

我尝试使用raw_id_fields,除了我不喜欢这种效果之外,它的效果也不是很好。加载花费了很多时间,并且不允许我添加更多 ID。诡异的。

我用过,admin.StackedInline但运气不好,因为它会尝试加载每个合约,而这只需要 2000 年。

当 Musician 与 Band 有直接关系时,它与这个库配合得很好。但现在这种关系并不是直接的。看起来自动完成功能不支持它(无论如何它都变得很慢)。

因此,我向各位 SO 成员大人请教。最好的方法是什么?是自动完成吗?一定有人遇到过这个问题!

提前致谢。

Viv*_*enG 1

为了避免加载管理页面中的每个带区,请使用autocomplete_fields Django doc
只需在您的admin.py.

autocomplete_fields = ('bands',)
Run Code Online (Sandbox Code Playgroud)

然后,不会将任何带从数据库拉到前面,但您将能够通过 Select2 搜索字段选择它,并将其打印为“标签”。