【问题标题】:Select all foreign keys from the foreign key table in django从django的外键表中选择所有外键
【发布时间】:2021-09-03 20:42:47
【问题描述】:

假设我有 2 个模型:

Class Tree(models.Model):
    title = models.CharField(max_length=255)

Class Apple(models.Model):
    tree = models.ForeignKey(Tree, related_name="apples")

如何选择所有具有苹果
我的意思是我想从 Tree 的实例中选择存在于 Apple 模型中的所有 Trees

我想我想执行这个查询:

SELECT DISTINCT tree.id, tree.title
FROM apple JOIN tree ON apple.tree = tree.id  

到目前为止,我已经编写了 2 个查询并且它们正在工作,但我认为它们不是最好的做法:

Tree.objects.filter(
    apples__tree__in=Apple.objects.all().values_list("tree")
).distinct()
 
Tree.objects.filter(apples__tree__isnull=False).distinct()

【问题讨论】:

标签: django django-models


【解决方案1】:

你可以直接查询'NULL'的关系

Trees.objects.filter(apples__isnull=False).distinct()

附:如果你想要确切的查询,你可以这样写(但你只会得到字典,而不是 Tree 对象):

Apple.objects.order_by().values('tree__id', 'tree__title').distinct()

【讨论】:

  • 感谢您的回答,问题是我不想使用isnull,因为在我的查询中它将添加WHERE tree.id IS NOT NULL。我想要一个没有WHERE 子句的查询。
  • 好吧,如果实现了您的目标,基本 SQL 构造有什么问题?有什么具体原因吗?
  • 我认为这种方式在较大的查询中速度更快,因为它不检查WHERE 子句,它只是简单的SELECT *,您的查询可以正常工作,我需要的是查询优化。
  • 除非您有特定的性能限制并违反它们,否则不要优化。除非你能有意义地衡量它,否则它是不存在的
  • @MojixCoder 我在答案中添加了另一个查询。如果有帮助请接受
【解决方案2】:

您可以使用 django 聚合。

from django.db.models import Count
User.objects.annotate(page_count=Count('page')).filter(page_count__gte=2).count()

【讨论】:

  • 我相信你不应该从完全不同的模型复制粘贴其他问题的解决方案..
猜你喜欢
  • 2021-06-02
  • 2015-09-19
  • 2021-01-13
  • 2011-03-14
  • 2015-09-24
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多