python - 在 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_id
s 中的每个选择与该匹配id_number
且具有最新modified
日期的单行(如果日期相同,则选择多行)。
解决方案
我一开始就不明白你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'))