具有ManyToMany字段的Django表单,500,000个对象超时

时间:2013-05-10 14:22:38

标签: django django-forms

让我们举例说,我有一个名为“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进行一些繁琐的操作来仅编辑客户端记录中的电话号码。在浪费我所有的时间之前,我想看看是否有某种方式可以解决这个问题,而不会让我的页面挂起。

4 个答案:

答案 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)

我们使用此第三方小部件:

https://github.com/crucialfelix/django-ajax-selects

是的,你的'例子'上面的数据库设计确实很糟糕,原因很多。您应该将电话号码作为客户端模型上的文本字段,然后您就不会遇到这些问题。 ; - )