gpt4 book ai didi

python - Django 通过最后创建的对象进行反向查询

转载 作者:行者123 更新时间:2023-11-29 12:13:51 24 4
gpt4 key购买 nike

我有两个模型:

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. 后使用qsqs.values()qs.values_list()时Django自动生成子查询__in 查找。因此,无需使用 list() 包装查询集(这也引入了不必要的评估和不必要的中间 SQL)或在 中编写 flat=True qs.values_list()
  2. statuses__id__inactivities 中查找已经引入了表连接,因此最好将 status__instatus_satisfied_ids 移动到activities 以利用连接。否则,status_satisfied_ids 会引入额外的选择。

或者您可以使用 Window functions of PostgreSQL直接按排名过滤。

关于python - Django 通过最后创建的对象进行反向查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14922508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com