首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在自定义多对多模型上使用筛选器的Django左连接

问在自定义多对多模型上使用筛选器的Django左连接
EN

Stack Overflow用户
提问于 2019-05-16 21:14:00
回答 2查看 489关注 0票数 0

我有3个模型(用户默认模型,项目,点击用户-自定义m2m模型),我想在ClickedUsers和项目模型上执行左连接和过滤器。我尝试了Stack Overflow上的解决方案,但当我打印这些查询时,我看到它们执行了内连接。

以下是我的模型:

代码语言:javascript
复制
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)

和我想要执行的查询:

代码语言:javascript
复制
select * from project LEFT JOIN clickedusers ON project.id = clickedusers.project_id WHERE clickedusers.user_id = 1;

如何使用django orm完成此查询?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-16 22:45:08

在此查询中,LEFT JOIN不会给出与INNER JOIN不同的结果

代码语言:javascript
复制
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,而不需要更改结果。

票数 2
EN

Stack Overflow用户

发布于 2019-05-16 21:17:29

查看反向关系和related_name。

代码语言:javascript
复制
Project.objects.filter(clicked_users__id=1)

或者使用直通模型:

代码语言:javascript
复制
Project.objects.filter(clickedusers_set__user_id=1)

编辑:我错过了来自select * from的*。如果你需要所有的字段,那么你需要使用:

代码语言:javascript
复制
ClickedUser.objects.filter(
    user_id=1,
).select_related('project')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56169483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档