【问题标题】:django : order queryset by model method without converting to listdjango:通过模型方法订购查询集而不转换为列表
【发布时间】:2012-11-09 18:54:41
【问题描述】:

我有一个模型 Complaintget_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()

我必须通过get_latest_response().date_response订购这些complaints

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

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

因为在那之后我在object_list 中渲染了这个queryset

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)

也不行

你能给我一些建议吗?

【问题讨论】:

    标签: python django list django-queryset


    【解决方案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.

    【讨论】:

    • 但使用 select_related 我会收到所有回复的信件,因此会有重复的投诉。所以我必须按投诉分组,但在订购后分组
    • 但是 ResponseLetter 有外键来投诉。你的方法应该有效吗?所以我试过了,它返回错误的数据(有重复的投诉)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 2020-11-14
    • 2021-11-08
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多