过滤查询集和 'Q' 运算符上的不同值

Distinct values on filtered queryset and 'Q' operator

我有这些型号:

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))

如果每个 event 有多个 dateevent,这会得出更理想的结果,但我不希望这样。这是我尝试获取不同值的尝试,但失败并出现 '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')

我觉得你把事情搞得太复杂了。您可以使用 .distinct() [Django-doc]:

Event.objects.filter(
    dateevent__start_date_time__gte=start_date,
    dateevent__start_date_time__lte=end_date
)<strong>.distinct()</strong>

您不能在相关的 dateEvent.order_by(..),从那时起您将因此成为 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(
    <b>first_event=Min('dateevent__start_date_time')</b>
).<strong>order_by('first_event')</strong>.distinct()