我在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中甚至可能吗?
非常感谢。
答案 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
参数化日期。