django:按模型方法排序查询集而不转换为列表

时间:2012-11-21 13:46:58

标签: python django list django-queryset

我的模型Complaint带有get_latest_response方法

class Complaint(models.Model):
    message         = models.TextField(blank=True)
    email           = models.CharField(max_length=255)

    def get_latest_response(self):
        return ResponseLetter.objects.filter(complaint=self)[:1][0]

方法get_latest_response将此次投诉的最新回复

ResponseLetter型号

class ResponseLetter(models.Model): 
    date_response       = models.DateField(db_index=True)
    response_content    = models.TextField()
    response_from       = models.CharField(max_length=255)

    complaint           = models.ForeignKey(Complaint)

    class Meta:
        ordering = ["-date_response"]

然后在view我收到投诉(queryset

complaints = Complaint.objects.all()

我必须按complaints

订购这些get_latest_response().date_response

但!我无法将此queryset转换为list

complaints = list(complaints)
complaints.sort(key=lambda x: x.get_latest_response().date_response)

因为在那之后我在queryset中呈现了这个object_list

return object_list(request, template_name = 'complaint/complaints.html',
        queryset = complaints, paginate_by = COMPLAINTS_PAGE_SIZE,
        extra_context=extra_context
    )

也是方法:

sorted(complaints, key=lambda a: a.get_latest_response().date_response)

也不起作用

你可以给我任何建议吗?

1 个答案:

答案 0 :(得分:1)

您想要列出ResponseLetter.date_response所订购的投诉。但是order_by和distinct不是play well together。这是一个解决方法:

from django.db.models import Max

Complaint.objects.annotate(max=Max('responseletter__date_response')).order_by('-max')

Tested/working