Django的“ChoiceField”的替代形式,可以处理数千个条目

时间:2012-03-12 21:37:52

标签: django forms widget scalability

我的表单中包含ChoiceField。它将作为下拉框呈现给用户。

问题是,我在这个领域有成千上万的条目,这导致页面(a)加载非常缓慢,(b)缓慢。

我想要一个可以处理10,000多个选择的替代小部件,而不是Select

管理员的raw_id_fields之类的东西会很好(如果只有它可用于一般形式......)但我对这些想法持开放态度。

3 个答案:

答案 0 :(得分:1)

如果自动填充是您的用户界面的一个选项,您可以查看django-simple-autocomplete

  

应用程序启用jQuery UI自动完成小部件   ModelChoiceFields需要最少的配置。

已编辑(回复OP评论)

我还没有测试过这个解决方案,但是挖掘文档和源代码似乎并非所有数据都是一次加载的:

  

指定窗口小部件的URL的功能使您可以连接到   如果您愿意,可以使用其他更高级的自动填充查询引擎。

Source code

def get_json(request, token):
    """Return matching results as JSON"""
            ...
            di = {'%s__istartswith' % fieldname: searchtext}     # <- look here!
            items = queryset.filter(**di).order_by(fieldname)[:10]

Widget source code

$("#id_%(name)s_helper").autocomplete({
    source: function(request, response){
        $.ajax({                                  # <-- look here
            url: "%(url)s",
            data: {q: request.term},
            success: function(data) {

答案 1 :(得分:0)

我不知道raw_id_fields是什么,但为什么不使用模型来存储你的所有选择呢?

class Choice(models.Model):
    value = models.CharField()

class MyModel(models.Model):
    choice = models.ForeignKey(Choice)

如果你想一次只显示20个,那么就很容易选择它。

答案 2 :(得分:0)

基于此评论(实际上,您应该包含在您的问题中):

  

让我澄清一下我的任务:我有10,000名用户。我有一个表格   你选择一个用户。您需要能够选择任何您想要的用户。   你不能只加载20,因为那时你将无法选择   其他9,980位用户。

如果您想要内置的内容,可以使用django.contrib.admin.widgets中的FilteredSelectMultiple小部件,它会在您的选择中添加过滤器。

您还应该cache 10,000个用户的结果,这样您每次都不会点击数据库。这是造成延迟的原因,而不是用户数量(对于实际性能问题而言,这是微不足道的。)