我是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。

有人可以帮忙吗?

最佳答案

您的模型有些“奇怪”。从ForeignKeyTb2Tb1也是primary_key=True。因此,这意味着该ForeignKey是唯一的,因此最多只能有一个链接到Tb2Tb1。因此,这意味着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/

10-11 04:56