我有一个模特:
class ModelTest(models.Model):
test_name = models.CharField(max_length=100)
test_field = models.IntegerField()
test_date = models.DateTimeField()
test_make = models.IntegerField()
现在,我想要对同一个test_field具有max test_date的行.
我所做的是ModelTest.objects.values(‘test_field’).annotate(td = Max(‘test_date’)).values(‘test_field’,’test_date’).
现在,我希望我获得所有其他字段值以及所选行.如果我尝试在任何值中添加它们,则注释不起作用.
什么是可能的解决方案?
更新:
测试数据:
test_name | test_field | test_date | test_make
test1 | 1 | 2012-01-23 15:24:10.389+05:30 | 3
test2 | 2 | 2012-01-23 15:24:26.747+05:30 | 5
test3 | 3 | 2012-01-23 15:27:19.033+05:30 | 1
test4 | 2 | 2012-01-23 15:29:45.098+05:30 | 4
test5 | 3 | 2012-01-23 15:54:01.322+05:30 | 2
现在,我希望输出为:
test1 | 1 | 2012-01-23 15:24:10.389+05:30 | 3
test4 | 2 | 2012-01-23 15:29:45.098+05:30 | 4
test5 | 3 | 2012-01-23 15:54:01.322+05:30 | 2
最佳答案 你可以使用这样的东西:
[ModelTest.objects.get(test_field=x['test_field'],test_date=x['td'])
for x in ModelTest.objects.values('test_field').annotate(td=Max('test_date'))
]
由于注释仅返回所需的字段,因此只有一个test_field test_date组合与您的结果相匹配.
Annotate不返回任何对象,只返回作为dicts的匹配列表,因此您必须再次查询对象.
更好的方法是编写自己的自定义查询并将其与extra
一起使用