Различимые значения на фильтрованном кверисете и оператор '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()
Вернуться на верх