我有两个模型:
class SomeActivity(models.Model):
name = models.ChartField(max_length=100)
class SomeStatus(models.Model):
name = models.CharField(max_length=100)
status = models.IntegerField(choises=STATUS_CHOISES)
some_activity = models.ForeignKey(SomeActivity, related_name='statuses')
活动的最后创建状态是当前状态。为了得到它,我使用这个代码:
try:
last_status = some_activity.statuses.latest('id')
except:
last_status = None
但问题是当我想要进行返回所有的查询时Activities
有一个last_status
匹配status__in=[1, 2]
.
这个解决方案有点扭曲,但我认为它会起作用:
from django.db.models import Max
max_status_ids = SomeActivity.objects.filter(statuses__isnull=False).annotate(
last_status_id=Max('statuses__id')
).values_list('last_status_id', flat=True)
status_satisfied_ids = SomeStatus.objects.filter(id__in=list(max_status_ids),
status__in=[1, 2]).values_list('id', flat=True)
activities = SomeActivity.objects.filter(statuses__id__in=list(
status_satisfied_ids))
我希望有更好的解决方案。
update
Try
max_status_ids = SomeActivity.objects.annotate(last_status_id=Max('statuses')
).values('last_status_id')
activities = SomeActivity.objects.filter(statuses__in=max_status_ids,
statuses__status__in=(1,2))
- Django 在以下情况下自动生成子查询
qs
, qs.values()
or qs.values_list()
之后使用__in
抬头。因此不需要用/包装查询集list()
(这也会引入不必要的评估,从而引入不必要的中间 SQL)或编写flat=True
inside qs.values_list()
-
statuses__id__in
里面查找activities
已经引入了表连接,这个最好移动status__in
from status_satisfied_ids
into activities
利用加入的优势。要不然,status_satisfied_ids
会引入额外的选择。
或者你可以使用PostgreSQL 的窗口函数 http://www.postgresql.org/docs/9.2/static/tutorial-window.html直接按排名位置进行过滤。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)