复杂的django查询,获取foreignkey_set不包含满足限制的对象的对象

Posted

技术标签:

【中文标题】复杂的django查询,获取foreignkey_set不包含满足限制的对象的对象【英文标题】:Complex django query, getting objects whose foreignkey_set does not contain an object that satisfies a restriction 【发布时间】:2019-06-23 18:28:43 【问题描述】:

我有一个模特foo 和一个模特barbar 有一个指向 foo 的外键,还有一个 days 字段,这是一个 postgresql DateRangeField

class Foo(models.Model):
    baz = models.CharField()

class bar(models.Model):
    foo = models.ForeignKey(Foo, on_delete=models.CASCADE)
    days = DateRangeField()

我需要做一个查询,给定一个日期 (day) 和一个 baz:获取所有满足 baz = baz 的 Foo 对象,并且 有关联的bar 对象满足days.lower < days < days.upper(或者换句话说,在其days 变量的范围内没有day

我查看了 Q 查询,但到目前为止我发现的唯一方法是获取所有满足 baz=bazFoo 对象,然后使用 python 来完成其余的工作(即在数据库查询方面显然效率低下)。

【问题讨论】:

你使用的是哪个 Django 版本? @ArpitSvt 版本 >2 【参考方案1】:

我不完全理解您的问题,但您似乎应该这样做:

Foo.objects.filter(baz=baz).exclude(bar__days__contains=day)

【讨论】:

这行得通,只是 Foo 没有 bar 字段。 Bar 有一个指向 foo 的外键 没关系,Django 支持querying across reverse relations。也许你应该展示你的真实模型,以及你得到的错误。 我没有意识到。我认为反向关系需要select_related() 或类似的。这行得通,谢谢!【参考方案2】:

您可以从psycopg2.extras 函数中尝试DateRange。这是一个例子,link

【讨论】:

是的,但我需要先按照相关键,类似这样(但这不起作用,因为第二个过滤器试图过滤 Foo,而不是 Bar):Foo.objects.filter(baz=baz).select_related("bar").filter(days__contains=day)

以上是关于复杂的django查询,获取foreignkey_set不包含满足限制的对象的对象的主要内容,如果未能解决你的问题,请参考以下文章

Django - 遵循向后的 ForeignKey,然后是 ForeignKey(查询)

基本 Django 查询

来自 ForeignKey 的 django 反向关系查询

用于从相关查询中列出所有 ForeignKey 对象的 Django 查询

将查询集数据传递给另一个查询 django

ForeignKey null=True 时 Django 慢查询