簡體   English   中英

Django過濾任何日期范圍包含的日期

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM