【问题标题】:Django: Query which excludes all children if the parent is included in the queryDjango:如果父项包含在查询中,则查询排除所有子项
【发布时间】:2017-03-28 14:18:14
【问题描述】:
class Person(TimeStampedModel):
    name = models.CharField(max_length=32)
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children')
    is_child = models.BooleanField(default=False,)

我正在尝试形成一个查询,如果他们的父母在场,则排除所有孩子。在我的 PostgreSQL 中,孩子们暂时占模型条目的 30%。

我的方法是使用nested query。但是,我不确定这是否是最有效的解决方案。

感谢您的帮助。

更新

我想出的python解决方案如下:

a = Person.objects.filter(...)
ids = [i.id for i in a]
result = [x for x in a if any((not x.is_child, x.parent_id not in ids))]

【问题讨论】:

  • 在性能方面,我不明白为什么您不只执行原始查询并从结果中排除 python 代码中的子项。但是测量查询时间可能是最好的判断方法。顺便说一句,您使用嵌套查询的方法在 PostgreSQL 中应该可以正常工作。
  • @dirkgroten 确实,这个点很好,我会测试一下,谢谢!

标签: python django postgresql django-queryset


【解决方案1】:

试试这个:

qs0 = Person.objects.filter(...)
qs = qs0.exclude(is_child=True, parent__in=qs0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多