我有3个模型(用户默认模型,项目,点击用户-自定义m2m模型),我想在ClickedUsers和项目模型上执行左连接和过滤器。我尝试了Stack Overflow上的解决方案,但当我打印这些查询时,我看到它们执行了内连接。
以下是我的模型:
class Project(models.Model):
…
clicked_users = models.ManyToManyField(User,through='ClickedUsers',blank=True)
class ClickedUsers(models.Model):
user = models.ForeignKey(User,on_delete=models.CASCADE)
project = models.ForeignKey(Project,on_delete=models.CASCADE)
status = models.IntegerField(default=0)和我想要执行的查询:
select * from project LEFT JOIN clickedusers ON project.id = clickedusers.project_id WHERE clickedusers.user_id = 1;如何使用django orm完成此查询?
发布于 2019-05-16 22:45:08
在此查询中,LEFT JOIN不会给出与INNER JOIN不同的结果
SELECT *
FROM table_1
JOIN table_2 on table_2.table_1_id = table_1.id
WHERE table_2.field = some_value;因为在where子句中有一个来自table_2的字段,所以只有当table_2中有记录时,才能从table_1获取结果。LEFT JOIN表示即使table_2中没有满足联接条件的记录,也要从table_1获取记录。
没有从您想要的ORM获得查询的原因是,ORM认识到它可以使用INNER JOIN而不是LEFT JOIN,而不需要更改结果。
发布于 2019-05-16 21:17:29
查看反向关系和related_name。
Project.objects.filter(clicked_users__id=1)或者使用直通模型:
Project.objects.filter(clickedusers_set__user_id=1)编辑:我错过了来自select * from的*。如果你需要所有的字段,那么你需要使用:
ClickedUser.objects.filter(
user_id=1,
).select_related('project')https://stackoverflow.com/questions/56169483
复制相似问题