Запросы Джанго, использующие Q

У меня есть следующее

модель проекта:

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   

таблица 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, проект 2, проект 3, проект 4]

Что я делаю неправильно?

1 ответ

Решение

Причина, по которой вы получаете Project 1 а также Project 2 дважды, потому что ваш or условный по-прежнему оценивается правильно с любым запросом. Вам нужно использовать distinct() метод в конце вашего набора запросов.

Project.objects.filter(Q(co_workers=1)| Q(creator=1)).distinct()
Другие вопросы по тегам