2012-03-12 13 views
1

私はChoiceFieldという形をしています。ドロップダウンボックスとしてユーザーに表示されます。何千もの項目を扱うことができるDjangoの `ChoiceField`の代替形式

問題は、このフィールドには(a)負荷が非常に遅く、(b)低速になる原因となる数千もの項目があります。

Selectの代わりに、10,000を超える選択肢を処理できる別のウィジェットが必要です。

adminのraw_id_fieldsのようなものは良いでしょう(一般的な形式でしか使えないのですが...)が、私はアイデアを開いています。

答えて

1

オートコンプリートを使用すると、django-simple-autocompleteに見てみることができ、あなたのUIのオプションの場合:

アプリケーションに必要な最小限の構成で ModelChoiceFieldsのためのjQuery UIのオートコンプリートウィジェットの使用を可能にします。

EDITED(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) { 
+0

このウィジェットのjQueryデモを見てみると、HTMLの一部として*すべての*オプションを含める必要があるようです。これは私の問題を解決しません。なぜなら、HTMLページに何千ものユーザー名を含めると、非常にゆっくりと読み込まれるからです。 –

+0

あなたのコメントのために投稿を更新しました。 – danihp

0

私はraw_id_fieldsは何か分かりませんが、モデルを使用してすべての選択肢を保存するのはなぜですか?

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

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

たとえば、一度に20個しか表示しない場合は、簡単に選択できます。

+0

これはどのように動作するのかわかりません。 私の仕事を明確にしましょう:10,000人のユーザーがいます。私はあなたがユーザーを選ぶという形をしています。任意のユーザーを選択できる必要があります。あなたは他の9,980人のユーザーを選択することができないので、あなたは20をロードすることはできません。 (ページ設定はオプションではありません。なぜなら100sのページをスクロールするのはひどいからです) –

+0

私はあなたの質問を正しく理解していませんでした。だから私は、burhanの解決策はおそらく行く方法だと思います。 –

0

私は私を明確にしましょうタスク:10,000人のユーザーがいます。私は というユーザーがあなたを選ぶという形になっています。任意のユーザーを選択できる必要があります。 あなたは 他の9,980人のユーザーを選択できないため、20人だけを読み込むことはできません。

あなたは組み込みの何かをしたい場合、あなたはあなたの選択にフィルタをかけている、django.contrib.admin.widgetsからFilteredSelectMultipleウィジェットを使用することができます。

また、10,000人のユーザーの結果はcacheであるため、毎回データベースにヒットしません。これはあなたの遅れを引き起こすものであり、ユーザーの数ではありません(これは実用的なパフォーマンス上の問題ではありません)。

関連する問題