让我们举例说,我有一个名为“Client”的模型和一个名为“PhoneNumbers”的模型
class PhoneNumbers(models.Model):
number = forms.IntegerField()
class Client(models.Model):
number = forms.ManyToManyField(PhoneNumbers)
客户与PhoneNumbers存在ManyToMany关系。 PhoneNumbers中有近500,000条记录,因此在使用带有M2M字段的MultiSelect小部件从模型表单编辑客户端记录时,需要永久加载。事实上,它永远不会。它只是坐在那里试图加载我假设的所有这些手机对象。
我的解决方法是使用ajax和jquery进行一些繁琐的操作来仅编辑客户端记录中的电话号码。在浪费我所有的时间之前,我想看看是否有某种方式可以解决这个问题,而不会让我的页面挂起。
答案 0 :(得分:6)
您需要为此字段创建自定义窗口小部件,以便您自动填充正确的记录。如果您不想自己动手:http://django-autocomplete-light.readthedocs.io/
我已经将它用于其通用关系支持,M2M自动完成看起来非常简单直观。在此处查看使用视频:http://www.youtube.com/watch?v=fJIHiqWKUXI&feature=youtu.be
在阅读了关于在管理员之外需要它的评论之后,我又看了一下django-autocomplete-light
库。 It provides widgets you can use outside the admin
from dal import autocomplete
from django import forms
class PersonForm(forms.ModelForm):
class Meta:
widgets = {
'myformfield': autocomplete.ModelSelect2(
# ...
),
}
答案 1 :(得分:4)
开箱即用,模型管理员有一个raw_id_fields
选项,可让您的页面加载速度更快。但是,原始id字段的用户界面不是非常直观,因此您可能必须推出自己的解决方案。
答案 2 :(得分:2)
自Django 2.0以来,Django Admin附带了autocomplete_fields
attribute,可为外键和多对多字段生成自动完成小部件。
class PhoneNumbersAdmin(admin.ModelAdmin):
search_fields = ['number']
class ClientAdmin(admin.ModelAdmin):
autocomplete_fields = ['number']
请注意,这仅适用于Django管理员的范围。要在管理员之外获取自动填充字段,您需要一个额外的包,例如django-autocomplete-light
,如其他答案中所建议的那样。
答案 3 :(得分:0)
我们使用此第三方小部件:
是的,你的'例子'上面的数据库设计确实很糟糕,原因很多。您应该将电话号码作为客户端模型上的文本字段,然后您就不会遇到这些问题。 ; - )