Django order_by一个相关的_set

时间:2010-02-01 08:09:45

标签: django sql-order-by

我为客户提供了一个模型,并为他们的购买/订单提供了模型。在我们的后端/网络管理员中,我们希望能够按最近的订单对客户列表进行排序。

基本上我们的模型看起来像

class Customer(models.Model):
    username = models.CharField(max_length=32)
    first_name = models.CharField(max_length=322)
    def __unicode__(self):
        return "%s" % self.username
    def get_last_order_date(self):
        self.order_set.latest('purchase_date')

class Order(models.Model):
    customer = models.ForeignKey(Customer)
    purchase_date = models.DateTimeField()

我可以使用我的get_last_order_date函数显示每个客户的最新订单,但是我不能按该功能排序(或者至少我不知道如何)。我已经尝试了我能想到的一切:

.order_by('order__purchase_date')
.order_by('order__set').latest('purchase_date')

还有更多没有运气。

非常感谢任何提示或线索。

感谢。

2 个答案:

答案 0 :(得分:14)

您不能在函数级别使用order by,因为它是在数据库级别完成的。您可以使用。sort(key=get_last_order_date)手动对查询集进行排序,但这不会非常有效。

更好的方法是使用Django的聚合功能,以获得客户的最大购买日期并对其进行排序:

from django.db.models import Max
Customer.objects.annotate(latest_order=Max('order__purchase_date')).order_by('latest_order')

答案 1 :(得分:0)

您绝对无法通过自定义方法进行排序(因为您的数据库不知道它)。

现在,似乎很难在模型级别做你想做的事情,所以也许可以使用python将它移动到视图和命令,如下所示:

sorted(Customer.objects.all(), key=get_last_order_date)