Запросы Джанго, использующие 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()