我是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'))
我离开了加入ID的两个表。我不确定如何使用tb2的字段添加if和max条件。每次我尝试使用字段时,都会给我FieldError。
有人可以帮忙吗?
最佳答案
您的模型有些“奇怪”。从ForeignKey
到Tb2
的Tb1
也是primary_key=True
。因此,这意味着该ForeignKey
是唯一的,因此最多只能有一个链接到Tb2
的Tb1
。因此,这意味着COUNT(DISTINCT p.version)
始终最多为1。
但是,您可以使用以下方法检索给定版本的最大值:
Tb1.objects.filter(
pk__in=[10, 9]
).annotate(
ver=Max('tb2__version')
)
如果没有相关的
Tb2
实例,它将把None
传递给ver
属性。关于mysql - 将SQL连接查询转换为Django ORM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58153679/