Django Q плохая логика запросов
Я пытаюсь создать менеджера, у которого есть метод 'active_or_users' для извлечения всех учетных записей, которые активны или которые создал пользователь. Активная учетная запись имеет дату начала, которая либо сегодня, либо где-то в прошлом, и дату окончания, которая находится где-то в будущем. Прямо сейчас метод active_or_users работает, однако он возвращает дубликаты одного и того же объекта. Он возвращает три копии созданной пользователем активной работы. Это не идеально.
from django.db.models import Q
from django.db import models
from django.contrib.auth.models import User
class ActiveJobs(models.Manager):
def active(self):
return super(ActiveJobs, self).get_query_set().\
filter(publications__publish_on__lte=date.today(),
publications__end_on__gt=date.today())
def active_or_users(self, user):
return super(ActiveJobs, self).get_query_set().\
filter((Q(publications__publish_on__lte=date.today()) &
Q(publications__end_on__gt=date.today())) | Q(creator=user))
class Job(models.Model):
title = models.CharField(max_length=100)
slug = models.SlugField(blank=True, null=True)
creator = models.ForeignKey(User)
objects = ActiveJobs()
class JobPublicationRecord(models.Model):
job = models.ForeignKey('Job', related_name='publications')
publish_on = models.DateField(auto_now=False)
end_on = models.DateField(auto_now=False, auto_now_add=False,
blank=True, null=True)
1 ответ
Поместить комментарии в ответ
С OR
запрос, экземпляр будет возвращен для каждого попадания запроса. Т.е.: экземпляр, если задание создано пользователем, и другой экземпляр того же задания, если также в указанном диапазоне дат, и т. Д.
Чтобы исправить это, измените метод active_or_users
чтобы:
def active_or_users(self, user):
return super(ActiveJobs, self).get_query_set().filter(
(Q(publications__publish_on__lte=date.today()) &
Q(publications__end_on__gt=date.today())) | Q(creator=user)).distinct()