3

クエリを実行するときに db にいつ触れるのか疑問に思っています。より正確には、クエリがいつ実行されるか:

私はこのkwargs dicを持っています:

kwargs = {'name__startswith':'somename','color__iexact':'somecolor'}

しかし、クエリのためだけにname__startswith、私はする必要がありますdistinct(). ではありませんcolor__iexact

私は、次のように in ループを設定すると思いましname__startswithdistinct()

for q in kwargs: 
  if q == 'name__startswith':
    Thing.objects.filter(name__startswith=somename).distinct('id')

次に、すべてを動的にクエリします。

allthings = Thing.objects.filter(**kwargs)

しかし、これはどういうわけか間違っています。私はここで2つの異なることをしているようです..

これら 2 つのクエリを動的に実行するにはどうすればよいですか?

4

2 に答える 2

5

django クエリセットはlazyであるため、データを使用するまで実際のクエリは評価されません。

allthings = Thing.objects.filter(**kwargs)

if 'name__startswith' in kwargs:
  allthings = allthings.distinct('id')   

実際にデータを使用するまでは、クエリを実行しないでください。これは、必要に応じてクエリをフィルタリングするのに最適です


ドキュメントから:

QuerySet は怠惰です – QuerySet を作成する行為は、データベース アクティビティを伴いません。フィルターを 1 日中積み重ねることができ、Django は QuerySet が評価されるまで実際にクエリを実行しません。次の例を見てください。

>>> q = Entry.objects.filter(headline__startswith="What")
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")
>>> print(q)

これは 3 つのデータベース ヒットのように見えますが、実際にはデータベースの最後の行 (print(q)) で 1 回だけヒットします。一般に、QuerySet の結果は、ユーザーが「要求」するまでデータベースからフェッチされません。そうすると、データベースにアクセスして QuerySet が評価されます。評価が行われる正確なタイミングの詳細については、クエリセットが評価されるタイミングを参照してください。

于 2013-05-21T13:43:25.043 に答える
1

models.Qを使用 して、django で動的クエリを作成できます。

query = models.Q(name__startswith=somename)

query &= models.Q('color__iexact':'somecolor')

all_things = Thing.objects.filter(query).distinct('name')

args と kwargs を使用して動的に Django フィルター クエリを構築するもお読み ください。

于 2013-05-21T13:50:26.690 に答える