0

私はこれらの2つのクエリを持っています:

gifts = Products.objects \
    .filter(entry_query,in_stock__icontains='A-in') \
    .filter(~Q(title__icontains='Not Found'))

gifts1 = Products.objects \
    .filter(('city__name__iregex', 'Delhi'),in_stock__icontains='A-in') \
    .filter(~Q(title__icontains='Not Found'))

その場合gifts = gifts | gifts1、次のエラーが表示されます。

エラー ユーザー定義関数で例外が発生しました

次のような Q オブジェクトを使用する場合:

gifts = Products.objects \
    .filter((Q(entry_query) & Q(in_stock__icontains='A-in')) | Q(('city__name__iregex', 'Delhi'),in_stock__icontains='A-in') ) \
    .filter(~Q(title__icontains = 'Not Found'))

私は再び同じエラーが発生します

エントリークエリはこちら

(OR: ('title__iregex', u'bag'), ('description__iregex', u'bag'),('source_website_url__iregex', u'bag'))

誰かが私がどこで間違っているのか教えてください

4

1 に答える 1

1

最初のアプローチのエラーは、gifts1 と Gifts が既に QuerySets であるため( typeof(gifts) を試してください)、| を使用できないためです。それらの間の。'hi'|'goodbye' を使っていたようなものです。| のみを使用します。Q オブジェクトの場合。

構文を除いて、2 回目に行ったことはほとんど正しかったです。OR の場合は &、AND の場合は & です。コンマは Q での論理演算を提供しないため、フィルターで異なる引数が発生し、エラーが発生します。

& を使用することとフィルタを結合することの両方が Django では同等であることに注意してください (または同等であると想定されています) が、gift と gift1 を異なる QuerySets として取得し、それらを評価する最初のアプローチは異なります: そのアプローチは、データベースへの 2 つのアクセス (ヒット) につながります。 、フィルターまたは Q オブジェクトを 1 つのフィルターに結合すると、1回しかヒットしません

経験則として、データベースへのヒット数を最小限に抑える必要があります。

お役に立てれば

于 2013-06-04T12:07:57.867 に答える