2014-05-08 24 views
0

我可以修改以下查詢,使其使用Django ORM的簡明方式嗎?使用Django ORM的簡短記錄查詢

queryset.filter((Q(from_date__lte=from_date) & \ 
       Q(to_date__gt=from_date)) | \ 
       (Q(from_date__lte=to_date) & 
       Q(to_date__gt=to_date))) 

下面是一些例子:

"from_date": "2014-05-11 08:00:00", 
"to_date": "2014-05-11 10:00:00", 

"from_date": "2014-05-12 12:00:00", 
"to_date": "2014-05-12 15:00:00", 

這些都在數據庫

日期,如果你提交

fromDate=2014-05-11 08:00:00 
toDate=2014-05-11 13:00:00 

應該給我只是第一次約會

"from_date": "2014-05-11 08:00:00", 
"to_date": "2014-05-11 10:00:00", 

這裏再次,應該給我只是第一個結果

fromDate=2014-05-11 09:00:00 
toDate=2014-05-11 13:00:00 

如果我提交下列日期

fromDate=2014-05-11 07:00:00 
toDate=2014-05-11 09:00:00 

同樣,只有第一個結果應採取

如果你這樣做你可以得到兩個結果

fromDate=2014-05-11 09:00:00 
toDate=2014-05-12 13:00:00 

我希望你明白這個主意是什麼。

該查詢應該保持相同的邏輯!

+0

您可以使用[範圍](https://docs.djangoproject.com/en/dev/ref/models/querysets/#range)在兩個日期之間搜索日期字段,但它似乎不是您的情況。 – danihp

+0

你能告訴我它看起來如何嗎?提前致謝! – Krasimir

+0

你能強制你的'from_date'值小於或等於(或者嚴格小於,如果合適的話)你的'to_date'嗎?如果是這樣,這可以簡化。另外,模型中的'from_date'和'to_date'值可以爲空嗎? –

回答

1
queryset.filter(to_date__gt=from_date, from_date__lt=to_date) 

也就是說,要返回,事件必須在新事件開始後結束,並且必須在新事件結束之前開始。在新的from_date之前結束的任何內容都不會返回,也不會在結束之後纔開始。

這與您的原始查詢不完全匹配,但它與數據庫中存在完全在新日期設置的範圍內的記錄的註釋中描述的行爲完全匹配。

+0

這個例子沒有做它應該做的。他需要和日期位於另一天。 – Krasimir

+0

調整了一下。日期範圍邏輯總是需要更多的思考,而不是看起來應該如此。 –

+0

如果此時基地被覆蓋,我要求在此日期設置。 – Krasimir