Mar*_*era 2 django django-queryset
嗨,我正在尝试使用django的注释,我认为我做的一切都好,但我必须遗漏一些因为我得到一个属性错误
这是我的模特
class Operation(models.Model):
...
class Message(models.Model):
operation = models.ForeignKey(Operation)
sent_on = models.DateTimeField(auto_now_add=True)
...
Run Code Online (Sandbox Code Playgroud)
这就是我要做的事情:
ops = Operation.objects.filter(...)
ops.annotate(last_message=Max('message__sent_on'))
ops.order_by('-last_message')
print ops[0].last_message
Run Code Online (Sandbox Code Playgroud)
而且我得到了
AttributeError at ...
'Operation' object has no attribute 'last_message'
Run Code Online (Sandbox Code Playgroud)
请注意,如果我将注释更改为ops.annotate(last_message=Max('whatever'))I得到a FieldError,那么之前的语法是正确的...但为什么我不能访问last_message字段?
我正在使用django 1.6.10
谢谢!
Queryset方法不会修改现有的查询集,它们会返回一个新的查询集.所以你annotate和ops调用实际上并没有做任何事情,因为他们创建了一个新的查询集,然后它立即被抛弃.
您需要重新分配调用的结果:
ops = Operation.objects.filter(...)
ops = ops.annotate(last_message=Max('message__sent_on'))
ops = ops.order_by('-last_message')
Run Code Online (Sandbox Code Playgroud)
或者只是一气呵成:
ops = Operation.objects.filter(
...
).annotate(
last_message=Max('message__sent_on')
).order_by('-last_message')
Run Code Online (Sandbox Code Playgroud)