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

亚当·麦肯

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

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Django如何在LEFT JOIN中传递子查询

如何在 Django ORM 查询中的列中使用 timedelta?

如何在Django ORM中查询bilaminar数据?

如何在 Django ORM 查询中的列中使用 timedelta?

如何在 Django ORM 查询中实现多个排序级别

Django ORM JOIN查询

如何使用LEFT OUTER JOIN创建JPA查询

如何使用sqlx进行LEFT JOIN查询?

如何使用SQL LEFT JOIN查询

如何使用主查询中的LEFT JOIN和子查询中的INNER JOIN优化MySQL SELECT查询?

如何在非外键字段上的 Django ORM 上执行 LEFT OUTER JOIN

如何在Django rest框架响应中获取过滤的Django ORM查询结果

WHEN 条件在 JOIN 查询中如何工作?

如何编写从LEFT JOIN结果中减去INNER JOIN结果的SQL查询?

Django ORM-如何在不同日期的查询中获取不同的字段项

将LEFT OUTER JOIN查询转换为Django ORM queryset / query

如何在CDbCriteria Yii Framework中编写复杂的JOIN查询

如何在 SQL Server 的条件中执行 JOIN 查询?

如何在Laravel中执行此JOIN查询?

如何在JOIN查询中匹配多个条件

如何在Sqlkata中形成多个Join条件sql查询

如何在laravel中通过join查询来查看路由

如何在Access Join查询中添加where子句

如何在Django ORM上过滤查询

Django的。如何在JOIN查询和GROUP BY中获取所有字段

如何在 hive 查询中实现 LEFT/RIGHT OUTER JOIN 来替换 NOT IN?

如何在 Laravel 中通过 Left Join、count 和 group by 编写这个 SQL 查询?

将LEFT JOIN子查询限制为1个结果

Oracle 11g XE:如何将LEFT SQL JOIN转换为使用半联接和相关查询的查询?