首页 > 解决方案 > 在 Django Q 对象中查找最新日期

问题描述

对这段代码的结构不是 100% 满意,但不幸的是我目前无法更改它。我在 Django 中搜索一个大数据库,由于技术限制,我必须存储一个Q对象列表,并使用 Django 的reduce()函数将Q对象合并为单个Queryset. 我目前有这样的模型:

class Obj(models.Model):
    id_number = models.CharField(max_length=128)
    modified = models.DateField('%Y-%m-%d', default='1900-01-01')

我目前正在使用以下代码来选择id_number列表中存在的行latest_ids

split_queries = []
for id_num in latest_ids:
    split_queries.append(Q(id_number=id_num))
result = Obj.objects.filter(reduce(operator.or_, split_queries))

这按我的预期工作,但我只想保留最新id_number=id_num的日期和日期modified。我见过使用Django的aggregate()函数或latest()函数等解决方案,但我不知道如何将这些与Q对象一起使用。我希望有一个Q对象,例如

Q(id_number=id_num, Max('modified'))

Q对于 Django中的对象,这样的行为是否可能?

编辑 我正在使用的系统使用 SQLite。数据库很大,过去遇到过问题Too Many SQL variables(SQLite 只允许 1000 个),对于id_number选择许多 s 的查询,将查询分成更小的Q对象组解决了这些问题。

数据库有很多不同id_number的s,但是很多行有相同id_number的s。我希望能够为latest_ids 中的每个选择与该匹配id_number且具有最新modified日期的单行(如果日期相同,则选择多行)。

标签: pythondjangodate

解决方案


我一开始就不明白你Q的意思。Obj.objects.filter(id_number__in=latest_ids)为您提供其中id_number之一的行latest_ids

编辑:似乎您需要为您的用例保留 Q() 查询。在这种情况下,无法在 Q() 过滤器中添加您想要的内容。

但是对结果查询进行分组和注释可能不是这样的问题。尝试这个:

Obj.objects.filter(reduce(operator.or_, split_queries))\
    .values('id_number').annotate(latest_modified=Max('modified'))

推荐阅读