[英]Django filter on date contained by any date range
我試圖篩選具有一個模型DateField
(日期)來檢索queryset
情況下,其日期是在列表中的任何一個的DateRanges
但我在努力找出確切的邏輯,我需要。
例如,如果我有以下模型:
class Period(models.Model):
user = models.ForeignKey(User)
range = DateRangeField()
class Game(models.Model):
date = models.DateField()
並且我創建了 3 個不同的日期范圍,如何獲取日期在這 3 個日期范圍之一內的所有游戲的列表?
我知道我可以通過迭代的范圍,並使用鏈Q()
此過濾器,但我需要把所有這一切到注釋上的大型queryset
其將不得不使用子查詢,這樣就不會工作。
我目前的努力看起來像這樣:-
periods = Period.objects.filter(user__id=OuterRef('id')).values_list('range', flat=True)
games_in_periods = Game.objects.filter(date__contained_by=Subquery(periods))
但由於不工作contained_by
被比作日期范圍但queryset
dateranges的。
感覺就像我很接近,但我一定錯過了一些愚蠢的事情。
有任何想法嗎?
我理解你的問題,關於子查詢的文檔不夠清楚。
你試過這種方法嗎?
periods = Period.objects.filter(user__id=OuterRef('id')).values('range')
games_in_periods = Game.objects.filter(date__range=[Subquery(periods)])
對於不使用 PostgreSQL 函數的人,有一種更通用的方法可以做到這一點。
class Period(models.Model):
start = models.DateField()
end = models.DateField()
class Game(models.Model):
date = models.DateField()
然后在與Exists
配對的子查詢中使用OuterRefs
來匹配一個時期之間的游戲。
from django.db.models import OuterRef, Exists
periods = Period.objects.filter(
start__lte=OuterRef('date'), end__gte=OuterRef('date'))
Game.objects
.annotate(in_period=Exists(periods))
.filter(in_period=True)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.