我有以下型号:
class Collection(models.Model):
# some fields here ...
class Entry(models.Model):
collection = models.ForeignKey(Collection, reverse_name="entries")
start_time = models.DateTimeField()
end_time = models.DateTimeField()
现在我想查询至少有一个Collection
关联的所有Entry
我做的事情(我觉得非常古怪):
collections_qs = Collection.objects.annotate(
entry_count=Count('entries')
).filter(entry_count__gt=0)
哪个效果很好。但我想将此查询与两个datetime
start
和end
给出的日期/时间窗口搜索结合起来。我想出的是:
if start:
collections_qs = collections_qs.filter(entries__start_time__gte=start)
if end:
collections_qs = collections_qs.filter(entriess__end_time__lte=end)
但是,这只是重新排列了返回的Collection
的顺序,而不是内容。如何实现日期/时间搜索(最好只用一个查询)?
答案 0 :(得分:1)
对于反向FK(以及ManyToMany字段),
之间存在差异 .filter(a=b, x=y)
和.filter(a=b).filter(x=y)
(请参阅doc)。
当您同时具有start
和end
条件时,您需要的是filter(.,.)
条件,它将为您提供至少有一个Collections
的{{1}}验证这两种情况。
此外,Entry
似乎比Collection.objects.filter(entries__isnull=False).distinct()
更具可读性。
最后,当.annotate(entry_count=Count('entries')).filter(entry_count__gt=0)
上至少有一个条件时,您不需要任何过滤器来检查是否存在此类条目。