在Django中,如何根据连接表中的记录计数有条件地包含项目的查询集?

时间:2014-11-25 19:27:39

标签: django join conditional django-queryset

我们有一个媒体项目表,我们要为其分配不同的日期范围。例如,故事X我们可能希望提供一个月,在下个月隐藏它,并在下个月再次提供它。所以我们有一个日期范围表,您可以在其中指定多个开始/停止日期。但是如果在此表中没有指定任何内容,我们希望该项目显示出来。

问题是,如果在日期范围表中没有条目,如果项目包含在结果中,如何编写查询,但如果它有一个或多个条目,则仅在今天的情况下包含该查询。日期在该范围内。这就是我到目前为止所拥有的:

queryset = MediaItem.objects.filter(
    is_active=True, publish_date__lt=timezone.now(),
    mediaitem_date_range__start_date__lt=timezone.now(),
    mediaitem_date_range__stop_date__gt=timezone.now(),
).distinct()

日期范围模型如下:

class MediaItemDateRange(models.Model):
    media_item = models.ForeignKey(MediaItem, related_name='mediaitem_date_range')
    start_date = models.DateTimeField(null=True, db_index=True, blank=True)
    stop_date = models.DateTimeField(null=True, db_index=True, blank=True)

目前,这只会产生日期范围表中包含条目的结果,而且我们的大多数项目都没有这样的条目。我只想排除一个项目,如果它有一个条目,并且不在该条目的开始/停止日期的范围内。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好的,看起来我发现了一些可行的东西。不确定底层查询是如何有效地这样做的,但它是Django,所以我会假设最好的。

queryset = MediaItem.objects.filter(
    is_active=True, publish_date__lt=timezone.now(),
).exclude(
    mediaitem_date_range__start_date__gt=timezone.now(),
    mediaitem_date_range__stop_date__lt=timezone.now(),
).distinct()

这似乎就是我之后的事。