181

与えられたクラス:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=20)

動的引数に基づいてフィルタリングする QuerySet を使用することは可能ですか? 例えば:

 # Instead of:
 Person.objects.filter(name__startswith='B')
 # ... and:
 Person.objects.filter(name__endswith='B')

 # ... is there some way, given:
 filter_by = '{0}__{1}'.format('name', 'startswith')
 filter_value = 'B'

 # ... that you can run the equivalent of this?
 Person.objects.filter(filter_by=filter_value)
 # ... which will throw an exception, since `filter_by` is not
 # an attribute of `Person`.
4

5 に答える 5

348

Python の引数展開を使用して、この問題を解決できます。

kwargs = {
    '{0}__{1}'.format('name', 'startswith'): 'A',
    '{0}__{1}'.format('name', 'endswith'): 'Z'
}

Person.objects.filter(**kwargs)

これは非常に一般的で便利な Python イディオムです。

于 2008-11-22T02:48:30.277 に答える
7

簡単な例:

Django 調査アプリで、登録ユーザーを示す HTML 選択リストが必要でした。しかし、5000 人の登録ユーザーがいるため、クエリ条件 (特定のワークショップを完了した人など) に基づいてそのリストをフィルター処理する方法が必要でした。調査要素を再利用できるようにするために、調査の質問を作成する人がそれらの基準をその質問に添付できるようにする必要がありました (クエリをアプリにハードコーディングしたくありません)。

私が思いついた解決策は、100% ユーザー フレンドリーではありません (クエリを作成するには技術者の助けが必要です) が、問題は解決します。質問を作成するとき、編集者は辞書をカスタム フィールドに入力できます。

{'is_staff':True,'last_name__startswith':'A',}

その文字列はデータベースに保存されます。ビュー コードでは、 として返されself.question.custom_queryます。その値は、辞書のような文字列です。eval() で実際の辞書に戻し、**kwargs でクエリセットに詰め込みます。

kwargs = eval(self.question.custom_query)
user_list = User.objects.filter(**kwargs).order_by("last_name")   
于 2009-03-18T17:52:22.203 に答える
6

Django.db.models.Qは、まさに Django の方法で必要なものです。

于 2013-05-23T15:55:36.437 に答える
-2

非常に複雑な検索フォームは通常、単純なモデルがそれを掘り下げようとしていることを示しています。

正確には、列名と操作の値をどのように取得する予定ですか? 'name'の値はどこで取得します'startswith'か?

 filter_by = '%s__%s' % ('name', 'startswith')
  1. 「検索」フォーム?あなたは何をするつもりですか?-- 名前のリストから名前を選びますか? 操作のリストから操作を選択する 制限はありませんが、ほとんどの人はこれがわかりにくく、使いにくいと感じています。

    そのようなフィルターを持つ列はいくつありますか? 6? 12? 18?

    • いくつか?複雑な選択リストは意味がありません。いくつかのフィールドといくつかの if ステートメントは理にかなっています。
    • 多数?あなたのモデルは正しく聞こえません。「フィールド」は、実際には列ではなく、別のテーブルの行へのキーであるように聞こえます。
  2. 特定のフィルター ボタン。待ってください... これが Django 管理者の仕組みです。特定のフィルターはボタンに変わります。そして、上記と同じ分析が適用されます。いくつかのフィルターは理にかなっています。通常、フィルターの数が多いということは、一種の第 1 正規形違反を意味します。

多くの類似したフィールドは、多くの場合、より多くの行とより少ないフィールドが必要であることを意味します。

于 2008-11-22T02:36:56.447 に答える