我是 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。
有人可以帮忙吗?
最佳答案
您的模型有些“奇怪”。从 Tb2
到 Tb1
的 ForeignKey
也是一个 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/