Django通过最后创建的对象进行反向查询[英] Django reverse query by the last created object

本文是小编为大家收集整理的关于Django通过最后创建的对象进行反向查询的处理方法,想解了Django通过最后创建的对象进行反向查询的问题怎么解决?Django通过最后创建的对象进行反向查询问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有两个型号:

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

但是问题是我想进行一个查询,以返回具有last_status匹配status__in=[1, 2]的所有Activities.

推荐答案

此解决方案有些扭曲,但我认为它会起作用:

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

我希望有一个更好的解决方案.


更新

尝试

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))
  1. django会在qs,qs.values()或qs.values_list()时自动生成子查询,__in查找.因此,无需包装w/list()的QuerySets(也引入了不必要的评估,因此也不必要的中间SQL)或在qs.values_list()
  2. 内写flat=True
  3. activities在activities内部查找activities已经引入了一个表连接,因此将status__in从status_satisfied_ids移动到status_satisfied_ids中是status__in status_satisfied_ids activities以利用加入.否则,status_satisfied_ids会引入额外的选择.

否则您可以使用 postgresql的窗口函数直接通过排名.

本文地址:https://www.itbaoku.cn/post/1764120.html