【问题标题】:Django querysets - Performing subqueriesDjango 查询集 - 执行子查询
【发布时间】:2018-11-18 10:43:06
【问题描述】:

如何查询某个用户添加的所有组件?同样在生成的对象中,我也想拥有系统名称和项目名称。我看到了演示两个表的子查询的示例,但我需要 3 个表。 谢谢。

class component(models.Model):
    id = models.AutoField(primary_key=True)
    server = models.ForeignKey(server, on_delete="CASCADE")
    name = models.TextField(blank=True)
    comments = models.TextField()
    timestamp = models.DateTimeField(auto_now=True)

class system(models.Model):
    id = models.AutoField(primary_key=True)
    project = models.ForeignKey(project, on_delete="CASCADE")
    name = models.CharField(max_length=255,blank=True)
    comments = models.TextField()
    timestamp = models.DateTimeField(auto_now=True)


class project(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255,blank=True)
    comments = models.TextField()
    user = models.ForeignKey(User, on_delete="CASCADE")
    timestamp = models.DateTimeField(auto_now=True)

【问题讨论】:

  • 所以你想要属于系统的组件属于属于用户的项目,对吧?
  • 用户所有项目中所有系统的组件。还应包括系统名称和项目名称。

标签: django django-models django-queryset


【解决方案1】:

这里不需要使用子查询,我们可以简单地执行连接,通过“穿透”外键(在 Django 中这通常用两个连续的下划线__ 表示)。

如果你想要那么所有属于System 的Components 属于属于Project 的user,我们可以这样查询:

from django.db.models import F

Component.objects.filter(
    system__project__user=someuser
).annotate(
    system_name=F('system__name'),
    project_name=F('system__project__name')
)

someuser 要过滤的用户。

此查询集中的组件将具有额外的属性system_name 和project_name,分别包含系统和项目的名称。

【讨论】:

  • 谢谢。这样就完成了。
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 2021-12-10
  • 1970-01-01
  • 2018-12-20
  • 2013-03-16
  • 2019-08-05
  • 1970-01-01
  • 2020-10-26
相关资源
最近更新 更多