2017-09-07 7 views
0

の両方のフィールドとstopフィールドの両方を持つEventというモデルがあります。 null startフィールドとstopフィールドを除外したいイベントを除外します。Django Unionedクエリセットの.filter()で不正な結果が返される

tempset = Event.objects.filter(site__slug='test-site', owner__email='[email protected]') 
tempset2 = Event.objects.filter(site__slug='test-site', invite__slug='bill-compton') 

私はこのような労働組合を行うことを試みた:

tempset.union(tempset2) 

だけでなく、次のように:

tempset = Event.objects.filter(site__slug='test-site', owner__email='[email protected]').union(Event.objects.filter(site__slug='test-site', invite__slug='bill-compton')) 
これらの2つのクエリを使用して

は、私が2クエリセットを取得します

しかし、私はこの構文を使用して、フィルタリングしよう:

filtered_query = tempset.filter(start__isnull=False, stop__isnull=False) 

してからスタートをプリントアウトし、値を停止し、

for thing in filtered_query: 
    print(thing.start, thing.stop) 

私はこの出力を得る:

None None 
2017-09-01 11:00:25+00:00 None 
2017-09-03 11:00:00+00:00 2017-09-03 12:00:00+00:00 
2017-09-06 11:00:00+00:00 2017-09-06 12:00:00+00:00 
2017-09-06 11:00:54+00:00 2017-09-06 12:00:54+00:00 
2017-09-06 11:00:07+00:00 2017-09-06 12:00:07+00:00 

注:

私はマージする|文字を使用する場合2つのクエリーセットでは、このフィルタリングされたクエリーは正常に動作します。しかし、私は.union()がこのマージ動作を許可すると理解していました。

どのような考えですか?

答えて

0

は、クエリprint(filtered_query.query)を見てみてください。ほとんどの場合、フィルタリングはQuerySetに追加されません。おそらく、このチケットは同じ問題を説明しているでしょう:https://code.djangoproject.com/ticket/28519。私はそれを理解したよう

、(あなたが正確にUNIONを使用する場合)マージする前にデータをフィルタリングするために今すぐにできることすべて:

filtered_query = (
    Event 
    .objects 
    .filter(site__slug='test-site', owner__email='[email protected]', start__isnull=False, stop__isnull=False) 
    .union(Event.objects.filter(site__slug='test-site', invite__slug='bill-compton', start__isnull=False, stop__isnull=False)) 
) 

私が使用している場合| 2つのクエリーセットをマージするには、このフィルタリングされた クエリが正常に動作します。

|

マージ単一SELECTにクエリセットのWHERE条件が、2つのクエリ(二SELECT)の.union()コンバイン結果。両方のバリアントのSQLを比較する。

関連する問題