3

指定されたモデル フィールドで操作を実行する必要がある Django アプリに取り組んでいます。

Django には、クエリ制約を使用してモデル フィールドを参照するための呼び出しスタイルが既にあります。複数の用語は、2 つのアンダースコアを使用して述語に構成され、キーワード引数として渡されます。QuerySet.filter()とを使用したクエリセット フィルタリングでQ()は、次の構文を使用します。

stuff = MyStuff.objects.filter(name__isnull=False)
thing = MyStuff.objects.filter(Q(name__icontains="yo") & Q(ptype__iendswith="dogg")).get()

同じ構文がF()式で使用され、クエリ ステートメントで動的述語を作成するために使用されます。大多数の Django ユーザーは、この構文を何らかの形で (使用していない場合でも) 見たことがあるでしょう。

同様の動的に評価され、構成可能な Python イディオムを作成したいと思います-この質問のために、私はそれを呼び出しますG()-同じ構文を使用して、論理的に実行できる遅延評価されたフィールドルックアップインスタンスに同様のハンドルを提供します他のそのようなインスタンスと再結合します。

このタスクにどのように取り組むべきでしょうか? Q()とはどちらF()も のサブクラスですdjango.utils.tree.Node-- 少なくとも Django 1.4 にはあります (現在のように常に実装されているわけではなく、インターフェイスがプライベートである場合とそうでない場合があります)。kwarg-filter-expression アクションの多くは で行われるdjango.db.models.sql.Queryと私は信じています...これは、ORM の内臓の無数のビットに判読できない結合を伴う巨大で困難なクラスです。

クエリとフィルターの構文は、私が想像しているよりもはるかに簡単に実現できると確信しています。どこから始めればよいですか?

前もって感謝します。

4

1 に答える 1

2

二重下線付きキーワードで何をしようとしているのか正確にはわかりませんが、おそらく最も簡単な開始場所は次のとおりです。

>>> def G(**kwargs):
...     for key, value in kwargs.items():
...         print "{} = {}".format(key.split("__"), value)
...         
...     
... 
>>> G(some__key__here="val1", another__one__again="val2")
['some', 'key', 'here'] = val1
['another', 'one', 'again'] = val2

そこから、その情報をどうするかによると思います。お役に立てれば!

于 2013-01-16T00:58:27.103 に答える