0

我正在尝试过滤具有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日期范围。

感觉就像我很接近,但我一定错过了一些愚蠢的事情。

有任何想法吗?

4

2 回答 2

0

我了解您的问题,关于子查询的文档不够清楚。

你有没有尝试过这种方式?

periods = Period.objects.filter(user__id=OuterRef('id')).values('range')
games_in_periods = Game.objects.filter(date__range=[Subquery(periods)])
于 2019-02-12T18:01:41.693 回答
0

对于不使用 PostgreSQL 函数的人,有一种更通用的方法可以做到这一点。

class Period(models.Model):
    start = models.DateField()
    end = models.DateField()

class Game(models.Model):
    date = models.DateField()

然后OuterRefs在与 a 配对的子查询中使用Exists以匹配介于句点之间的游戏。

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)
于 2019-09-15T17:37:42.837 回答