可能不可能的Django问题:使用时间过滤器对Count of ForeignKey进行排序管理字段?

时间:2011-03-01 18:23:44

标签: django django-admin django-queryset

我在Django中有一个Book对象列表,我希望管理员用户能够按照过去三年中附加的Transations数量对它们进行排序。

我已经可以使用annotate和模型管理器对所有时间的事务对象数执行此操作,如下所示:

class Book(models.Model):
    title = models.CharField(max_length=400)
    def count(self):
        return self.transactioncount/2
    count.admin_order_field = 'count'
class Transaction(models.Model):
    book = models.ForeignKey(Book)
    transaction_date = models.DateTimeField()
class BookManager(models.Manager):
    def get_query_set(self):
        return super(BookManager,self).get_query_set().annotate(transactioncount=(Count('transaction')))

但我不知道过去三年如何为交易做这个 - 我想我需要重写我的注释函数,或者使用更复杂的东西?

这在Django中甚至可能吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

您无法在annotate内进行过滤,因此需要使用extra来计算在一个时间范围内计算交易的复杂表达式:http://docs.djangoproject.com/en/1.2/ref/models/querysets/#extra

Book.objects.extra(
    select={
        'recent_transaction_count': "SELECT COUNT(*) FROM app_transaction WHERE app_transaction.book_id = app_book.id AND app_transaction.transaction_date > '2008-03-08'"
    }
)

您需要将app替换为包含这些模型的应用名称。您可以使用select_params参数化日期。