mysql - 将 SQL 连接查询转换为 Django ORM

标签 mysql django join

我是 Django 模型的新手,正在尝试将遗留的 MySQL 查询转换为 Django 模型。我有两个表 tb1 和 tb2。我想加入两者并利用他们的两个领域来取得成果。

class Tb2(models.Model):
   tb2_id = models.ForeignKey('Tb1', models.DO_NOTHING, primary_key=True)
   profile = models.CharField(max_length=15)
   version = models.CharField(max_length=15)

class Tb1(models.Model):
   id = models.BigAutoField(primary_key=True)
   job_id = models.BigIntegerField(blank=True, null=True)

""" SELECT s.*, IF(count(distinct p.version)<=1, TRUE, FALSE) is_profile_same,
       MAX(p.version) ver,
       FROM tb1 s
       LEFT JOIN tb2 p ON p.tb2_id=s.id
       WHERE s.id in ('10','9') group by s.id  """

Tb1.tb1.filter().select_related('Tb2').annotate(join_profiles=Count('id'))

我已经在ids上加入了两个表。我不确定如何使用 tb2 的字段添加 if 和 max 条件。每次我尝试使用字段时,它都会给我 FieldError。

有人可以帮忙吗?

最佳答案

您的模型有些“奇怪”。从 Tb2Tb1ForeignKey 也是一个 primary_key=True。因此,这意味着此 ForeignKey 是唯一的,因此(最多)只能有一个 Tb2 链接到 Tb1。因此,这意味着 COUNT(DISTINCT p.version) 将始终最多为一个。

但是,您可以使用以下方法检索给定版本的最大值:

Tb1.objects.filter(
    pk__in=[10, 9]
).annotate(
    <b>ver=Max('tb2__version')</b>
)

如果没有相关的Tb2实例,它会将None传递给ver属性。

关于mysql - 将 SQL 连接查询转换为 Django ORM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58153679/

相关文章:

C# 登录页面。 SQL 数据库路径

python - 如何同时查询多个表?

python - 使用 ManyToMany 字段区分 Django 模型对象

sql - Oracle SQL 中 USING 和 ON 的区别

SQL 电子商务数据库 - 获取仅由一个用户购买的产品数量

mysql - 简单的MySQL数据库结构问题

php - 如何在 php 中使用日期条件获取数据

python - 操作错误:(2003, "Can' t 连接到 'mysql2.000webhost.com' (10060) 上的 MySQL 服务器”)

python - 将文件保存为没有表单的 FileField

sql - 程序上将子查询转换为连接