Возможно невозможный вопрос Django: сортировать поле администратора на Count of ForeignKey с временным фильтром? - PullRequest
2 голосов
/ 01 марта 2011

У меня есть список объектов Book в Django, и я хочу, чтобы пользователи-администраторы могли сортировать их по количеству вложенных переходов за последние три года.

Я уже могу сделать это для количества объектов транзакций за все время , используя 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')))

Но я не знаю, как сделать это для транзакций за последние три года - я думаю, мне нужно переписать мою функцию аннотации или использовать что-то более сложное?

Возможно ли это даже в Джанго?

Большое спасибо.

1 Ответ

1 голос
/ 08 марта 2011

Вы не можете фильтровать внутри 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'"
    }
)

Вам необходимо заменить1007 * с названием приложения, в котором содержатся эти модели.Вы можете параметризовать дату, используя select_params.

...