Django查询跨越外键

时间:2013-01-11 18:31:43

标签: django django-queryset

我有以下型号:

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 startend给出的日期/时间窗口搜索结合起来。我想出的是:

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的顺序,而不是内容。如何实现日期/时间搜索(最好只用一个查询)?

1 个答案:

答案 0 :(得分:1)

对于反向FK(以及ManyToMany字段),

之间存在差异

.filter(a=b, x=y).filter(a=b).filter(x=y)(请参阅doc)。

当您同时具有startend条件时,您需要的是filter(.,.)条件,它将为您提供至少有一个Collections的{​​{1}}验证这两种情况。

此外,Entry似乎比Collection.objects.filter(entries__isnull=False).distinct()更具可读性。

最后,当.annotate(entry_count=Count('entries')).filter(entry_count__gt=0)上至少有一个条件时,您不需要任何过滤器来检查是否存在此类条目。