Различимые значения на фильтрованном кверисете и оператор 'Q'
У меня есть эти модели:
class Event(models.Model):
title = models.CharField(max_length=200)
[...]
class dateEvent(models.Model):
event = models.ForeignKey('Event', on_delete=models.CASCADE)
start_date_time = models.DateTimeField(auto_now=False, auto_now_add=False)
[...]
и в моем views.py я хочу создать запрос, который выбирает событие, учитывая определенные параметры (дата начала и т.д.). У меня нет никаких проблем с моим запросом:
distinct = Event.objects.values('id').annotate(id_count=Count('id')).filter(id_count=1)
events = Event.objects.filter(Q(dateevent__start_date_time__gte=start_date) & Q(dateevent__start_date_time__lte=end_date))
Это приводит к более идеальным результатам, если для каждого dateevent имеется более одного event, чего я не хочу. Это моя попытка получить отличные значения, которая провалилась с ошибкой 'QuerySet' object has no attribute 'Q'. Что я упускаю?
events = Event.objects.filter(id__in=[item['id'] for item in distinct]).Q(dateevent__start_date_time__lte=end_date).distinct().exclude(type='recording release').order_by('dateevent__start_date_time')
I think you are making this too complicated. You can work with .distinct() [Django-doc]:
Event.objects.filter(
dateevent__start_date_time__gte=start_date,
dateevent__start_date_time__lte=end_date
).distinct()
Вы не можете .order_by(..) на связанных dateEvent, так как тогда вы, таким образом, станете частью клаузулы SELECT ... и помешаете фильтру уникальности работать правильно. Однако вы можете работать с агрегатом над ним. Например:
from django.db.models import Min
Event.objects.exclude(type='recording release').filter(
dateevent__start_date_time__gte=start_date,
dateevent__start_date_time__lte=end_date
).alias(
first_event=Min('dateevent__start_date_time')
).order_by('first_event').distinct()