Django注释引发AttributeError'对象没有属性'

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

谢谢!

Dan*_*man 6

Queryset方法不会修改现有的查询集,它们会返回一个新的查询集.所以你annotateops调用实际上并没有做任何事情,因为他们创建了一个新的查询集,然后它立即被抛弃.

您需要重新分配调用的结果:

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)