使用以下模型设置(为简便起见简化):
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的新手,我尝试了与ClaimCollaborators模型的select_related()的各种用法无济于事。有任何想法吗?
Django将自动进行连接:
claims = Claim.objects.filter(Q(permalink='foo-bar') & (Q(author_id=2) | Q(claimcollaborator__user_id=2)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句