Python 在Django Q对象中查找最新日期
对这段代码的结构不是100%满意,但不幸的是,我现在无法更改它。我正在Django中搜索一个大型数据库,由于技术限制,我必须存储Python 在Django Q对象中查找最新日期,python,django,date,Python,Django,Date,对这段代码的结构不是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='19
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\u编号的行,latest\u id
:
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\u number=id\u num
的行,并且日期修改的
是最新的。我见过一些解决方案,比如使用Django的aggregate()
函数或latest()
函数,但我不知道如何将它们用于Q
对象。我希望有一个Q
对象,比如
Q(id_number=id_num, Max('modified'))
Django中的Q
对象是否可能出现这种行为
编辑
我正在使用的系统使用SQLite。数据库很大,过去遇到的问题是SQL变量太多(SQLite只允许1000个),对于选择了许多id编号的查询,将查询分成更小的Q
对象组解决了这些问题
数据库具有许多不同的id\u编号
s,但许多行具有相同的id\u编号
s。我希望能够为latest\u id
s中的每一行选择与id\u编号
匹配且具有最新修改日期的单行(如果日期相同,则为多行)。首先我不理解您的Q
Obj.objects.filter(id\u number\u in=latest\u id)
提供id\u number
是最新\u id之一的行
编辑:似乎您需要为您的用例保留Q()查询。在这种情况下,无法在Q()过滤器中添加所需内容
但是对结果查询进行分组和注释可能不是这样的问题。试试这个:
Obj.objects.filter(reduce(operator.or_, split_queries))\
.values('id_number').annotate(latest_modified=Max('modified'))
但是这里有多个id\u编号
s?是的,有多个id\u编号
s。许多行具有相同的id\u编号
,对于每组,我只想在修改的
中选择最新日期的行。但是,最新id
列表中的每个id\u编号
都是唯一的。编辑了为什么选择Q
对象而不是标准的filter()
的问题,但这并没有改变您可以按修改日期排序以获取最后一个对象的事实。或在末尾聚合以获取最大值。在Q过滤器中不能这样做,因为它会过滤每一行(逐行),而最新的日期是一个聚合。如果在调用filter(reduce…
之后调用order\u by('modified')
,则QuerySet
将包含许多id\u编号,我相信last()
将忽略每个id\u编号
,只关注修改的日期。我想为每个id\u编号
保留一行,这是我不理解的最新修改日期的行。你应该在你的问题中澄清这一点。每个id_编号一行是什么意思?你的意思是有多行具有相同的id_编号?是的,我编辑了这个问题,希望增加数据库包含的内容以及我希望实现的内容的清晰度