过滤查询集和 '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()
我有这些型号:
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()