【问题标题】:Django order_by a related _setDjango order_by 一个相关的_set
【发布时间】:2011-01-11 15:12:44
【问题描述】:

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

这基本上是我们的模型的样子

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')

还有很多没有运气。

任何提示或线索将不胜感激。

谢谢。

【问题讨论】:

    标签: django sql-order-by


    【解决方案1】:

    您不能将 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')
    

    【讨论】:

    • 非常感谢!我一直在阅读和重新阅读文档并在网上搜索了一段时间。我使用 sorted() 创建了一个“解决方案”,但我真的不喜欢效率低下。再次感谢。
    • 终于找到了办法!非常感谢丹尼尔!
    【解决方案2】:

    您绝对不能通过您的自定义方法订购(因为您的数据库不知道它)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2016-05-15
      • 2019-01-18
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多