带有关系的 Django 查询

Posted

技术标签:

【中文标题】带有关系的 Django 查询【英文标题】:Django query with relations 【发布时间】:2020-01-14 12:38:09 【问题描述】:

我有一个凌乱而陈旧的查询,我正在尝试将其从 SQL 转换为 Django ORM,但我似乎无法弄清楚。 由于原始查询不应该公开,因此与我正在使用的内容类似:

表 1 身份证

表 2 身份证 用户名 活跃 生日 table_1_fk

表 3 身份证 金额 table_1_fk

我最终需要一个活跃用户列表(用户名),按日期排序,显示数量。表 2 和表 3 中的表 1 引用不按顺序排列。我遇到的主要问题是:

我如何仅使用 ORM 检索这些(没有循环/执行,或者如果我必须的话,几乎没有) 如果我不能单独使用 ORM 并决定只循环我需要的部分,我怎么能创建一个单独的对象来显示在表格中而不用多次循环所有内容?

我的艰难过程:

表 2 处于活动状态 -> 获取表 1 -> 在表 3 中查找表 1 pk -> 将表 3 信息添加到表 1?

表 1 -> 获取表 2 Actives, Table1 -> 获取表 3 金额 -> 根据 table1_fks 循环匹配

【问题讨论】:

【参考方案1】:

您可以使用 Table1 执行相关参考。如果您的模型看起来像这样:

from django.db import models
from django.db.models import F

class Table1(models.Model):
    ...

class Table2(models.Model):
    username = models.CharField(max_length=100)
    active = models.BooleanField()
    birthday = models.DateField()  # Sorted by date
    table1 = models.ForeignKey(Table1, related_name="table2")

class Table3(models.Model):
    amount = models.IntegerField()
    table1 = models.ForeignKey(Table1, related_name="table3")

您可以稍后再做:


>>> users = (
    Table1.objects
        .filter(table2__active=True)
        .annotate(
            username=F("table2__username"), 
            amount=F("table3__amount"), 
            birthday=F("table2__birthday")
        )
        .order_by("-birthday")
        .values("username", "amount", "birthday")
)
>>> print(users)
[
  ["user1", 100.0, "2020-01-13"],
  ["user2", 890.0, "2020-01-10"],
  ["user3", None, "2020-01-01"],
]

这完全取决于你的模型类是如何实现的。

【讨论】:

以上是关于带有关系的 Django 查询的主要内容,如果未能解决你的问题,请参考以下文章

告诉django不要跟随外键?

如何编写带有子查询的 Django 查询作为 WHERE 子句的一部分?

带有聚合的 Django 子查询

Django:ModelForm 使用自定义查询预填充复选框

Django - 跨关系查询

带有额外选择的 Django 查询集计数