Django order_by一个相关的_set

mho*_*ost 9 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()
Run Code Online (Sandbox Code Playgroud)

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

.order_by('order__purchase_date')
.order_by('order__set').latest('purchase_date')
Run Code Online (Sandbox Code Playgroud)

还有更多,没有运气.

任何提示或线索将非常感激.

谢谢.

Dan*_*man 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')
Run Code Online (Sandbox Code Playgroud)

  • 谢谢SOOO!我一直在阅读和重新阅读文档并在网上搜索一段时间.我使用sorted()创建了一个"解决方案",但我真的不喜欢低效率.再次感谢. (2认同)