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

ui7jx7zq  于 2023-01-21  发布在  Go
关注(0)|答案(2)|浏览(127)

所以,我有以下模型:

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万个乐队。我不知道,也许是白蛇乐队,金属乐队或其他什么乐队。

我们应该如何在Django管理员页面上做这些?

我试过使用raw_id_fields,除了我不喜欢它的效果外,它的效果也不是很好。它需要很长的时间来加载,而且它不允许我添加更多的id。很奇怪。
我用过admin.StackedInline,但没有成功,因为它会尝试加载a中的每一个合同,嗯,它只需要2000年。
当Musician和Band有直接关系时,它和this library的关系就很好。但是现在关系不是直接的了。看起来自动完成不支持它(不管怎么说,它变慢了)。
所以,所有这些,我问你主SO成员。**什么是最好的方法来做到这一点?**是自动完成吗?一定有人遇到了这个问题!
先谢了。

cbjzeqam

cbjzeqam1#

为了避免在管理页面加载每个乐队,请使用autocomplete_fields Django doc。
就像在admin.py中那样使用它。

autocomplete_fields = ('bands',)

然后不会有任何波段从DB拉到前面,但您将能够通过Select2搜索字段选择它,它将被打印为“标签”。

t30tvxxf

t30tvxxf2#

我找到了这个解决方案,并希望它能帮助一些人在同样的情况:
我在Product和Characteristic模型之间有很多对很多的关系,所以,在www.example.com中admin.py,我为Product设置了一个如下所示的表单,其中catch/get所有的Characteristic,并为Characteristic创建“predateth_related”,以及“select_related”。

class ProductAdminForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['characteristics'].queryset = Characteristic.objects.prefetch_related('category').all()

相关问题