我正在尝试过滤一个具有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
与一个日期范围进行比较。
感觉就像我接近了,但我一定错过了一些愚蠢的事情。
有什么想法吗?
答案 0 :(得分:0)
我了解您的问题,有关子查询的文档不够清楚。
您是否尝试过这种方式?
periods = Period.objects.filter(user__id=OuterRef('id')).values('range')
games_in_periods = Game.objects.filter(date__range=[Subquery(periods)])
答案 1 :(得分:0)
对于不使用PostgreSQL函数的人,有一种更通用的方法。
class Period(models.Model):
start = models.DateField()
end = models.DateField()
class Game(models.Model):
date = models.DateField()
然后在与OuterRefs
配对的子查询中使用Exists
来匹配介于某个时期之间的游戏。
from django.db.models import OuterRef, Exists
periods = Period.objects.filter(
start__lte=OuterRef('date'), end__gte=OuterRef('ts'))
Game.objects
.annotate(in_period=Exists(periods))
.filter(in_period=True)