如何在Django的ORM中创建等效的LEFT JOIN查询(1.11)

时间:2017-12-20 13:35:13

标签: python sql django

使用以下模型设置(为简洁起见而简化):

class Claim(models.Model):
    permalink = models.SlugField(max_length=255, blank=True, unique=True)
    author = models.ForeignKey(get_user_model(), db_index=True, on_delete=models.SET_NULL, null=True, blank=True)
    collaborators = models.ManyToManyField(get_user_model(), through='ClaimCollaborator', related_name='claims')
    # ...other fields

class ClaimCollaborator(models.Model):
    claim = models.ForeignKey(Claim, db_index=True, on_delete=models.CASCADE)
    user = models.ForeignKey(get_user_model(), db_index=True, on_delete=models.CASCADE)
    # ...other fields

我试图在Django的ORM中复制以下SQL查询。

SELECT *
FROM claim c
LEFT JOIN claim_collaborator cc ON cc.claim_id = c.id
WHERE c.permalink = 'foo-bar'
AND (c.author_id = 2 OR cc.user_id = 2)

我相信使用django.db.models.Q的逻辑应该是直截了当的,但我正在努力的是LEFT JOIN。 Django ORM noob的位,我尝试使用ClaimCollaborators模型的各种用途的select_related()无济于事。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

Django将自动进行加入:

claims = Claim.objects.filter(Q(permalink='foo-bar') & (Q(author_id=2) | Q(claimcollaborator__user_id=2)))