0

Djangoクエリを実行しようとしています:

#att.name is a string
kwargs = {att.name : F('node__product__' + att.name) }
temps = Temp.objects.exclude(**kwargs)

これが正しいかどうか疑問に思います。これまで見てきたすべての例では、値に文字列を使用していますが、値が関数の場合、このように値を文字列にする必要がありますか?

kwargs = {att.name : 'F('node__product__' + att.name)' }

値の関数は引数リストで熱心に実行されますか、それとも必要になるまで待機しますか?

4

4 に答える 4

5

Pythonでは、式は常に熱心に評価されます。Pythonには遅延評価はありません。一部のライブラリは、特定のタイプである必要がある値を代わりに文字列にすることで、この便利な機能の欠如を回避しますeval。この方法でdjangoモデルの一部を宣言できますが(相互参照の外部キー関係を宣言できるように)、djangoのクエリインターフェイスは宣言しません。文字列が「期待される」場合、通常、この種の手法を使用することはできません。これは、文字列の値とeval編集する必要のある文字列を区別する方法がないためです。

于 2011-07-28T00:21:09.680 に答える
0

最初のものだけが正しいです:

kwargs = {att.name : F('node__product__' + att.name) }
temps = Temp.objects.exclude(**kwargs)

怠惰/熱心がこの質問にどのように関連しているかわかりません。

于 2011-07-28T00:09:43.087 に答える
0

関数の引数は、関数が呼び出される前に評価されます。

>>> def foo(x): return x
...: 

>>> foo(sum(range(10)))
<<< 45

dictを作成すると、その時点ですべてが評価されます。

>>> kwargs = {'key': sum(range(10))}

>>> kwargs
<<< {'key': 45}

それで...

>>> def foo(**kwargs): return kwargs
...: 

>>> foo(**kwargs)
<<< {'key': 45}
于 2011-07-28T00:26:07.490 に答える
0

この質問があなたが興味を持っているからなのか、それともクエリをロードする方法を見つけようとしているのかはわかりません。だから私は推測します:

Q()関数を使用し、それらをargsにロードして、後でforを使用してTemp.objects.excludeに設定すると、次のようになります。

def mylolfunc(self, *args,**kwargs):
    queryset = Q() 
    for query in args:
        queryset |= query
return Temp.objects.filter(queryset)

ここで、queryはQ(att.name = F('node_ product _'+ att.name))またはそれ以上のQオブジェクトです。

チェックアウトしたい場合は、こちらのドキュメントをご覧ください。

このクエリは、情報を要求するまで実行されないため、遅延します。つまり、あなたが次のようなことをするまで

myquery = mylolfunc(*args)
myquery[0]  #-----> executes query here
于 2011-07-28T01:48:46.887 に答える