使用 Q 的 Django 查询

Posted

技术标签:

【中文标题】使用 Q 的 Django 查询【英文标题】:Django Queries using Q 【发布时间】:2015-11-12 02:11:22 【问题描述】:

我有以下

项目模型:

class Project(models.Model):
    creator = models.ForeignKeyField(settings.AUTH_USER_MODEL)
    name = models.CharField(max_lenght=200)
    co_workers = models.ManyToManyField(settings.AUTH_USER_MODEL)

表用户:

id_user username
 1       Frank
 2       Steve
 3       Eddie

表项目:

id_project project_name id_creator
 1          project 1       1     
 2          project 2       1
 3          project 3       1
 4          project 4       1   

table projects_users(m2m) 这个表是为同一个项目的另一个工人准备的:

id_user  id_project
 2         1
 3         1
 2         2
 3         2

当我进行以下查询时,我得到:

>>>Project.objects.filter(creator=1)

[project 1, project 2, project 3, project 4]

>>>Project.objects.filter(co_workers=1)

[]

这很好,但是当我输入时:

>>>Project.objects.filter(Q(co_workers=1)| Q(creator=1))

[Project 1, Project 1, Project 2, Project 2, Project 3, Project 4]

我期待得到:

[项目一、项目二、项目三、项目四]

我做错了什么?

【问题讨论】:

【参考方案1】:

您获得Project 1Project 2 两次的原因是您的or 条件仍然可以正确地使用任一查询进行评估。您需要在查询集末尾使用distinct() 方法。

Project.objects.filter(Q(co_workers=1)| Q(creator=1)).distinct()

【讨论】:

很高兴它有帮助。

以上是关于使用 Q 的 Django 查询的主要内容,如果未能解决你的问题,请参考以下文章

python测试开发django-76.ORM查询之Q查询

Django过滤查询和或

在 Django 中使用 Q() 动态构建复杂查询 [关闭]

使用 Q 的 Django 查询

使用 Q 自动生成 django 查询

在 Django 中使用 Q 查询外键值