Делаете довольно сложный метод модели Django, который можно сортировать в админке? - PullRequest
4 голосов
/ 07 января 2011

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

Я добавил admin_order_field, как рекомендовано в этом предыдущем вопросе , но я не до конца понимаю, что еще мне нужно сделать.

class Book(models.Model):
    id = models.IntegerField(primary_key=True)
    title = models.CharField(max_length=200)
    library_id = models.CharField(max_length=200, unique=True)
    def current_owner(self):
        latest_transaction = Transaction.objects.filter(book=self)[:1]
        if latest_transaction:
            if latest_transaction[0].transaction_type==0:
                return latest_transaction[0].user.windows_id
        return None
    current_owner.admin_order_field = 'current_owner'

В настоящее время, когда я нажимаю на поле current_owner в интерфейсе администратора, Django дает мне

FieldError at /admin/books/book/
Cannot resolve keyword 'current_owner' into field

Мне тоже нужно сделать BookManager? Если это так, какой код я должен использовать? Это не простой подсчет, как в примере из предыдущего вопроса, поэтому помощь будет принята:)

Спасибо!

Ответы [ 2 ]

2 голосов
/ 07 января 2011

Администратор Django не будет упорядочивать модели по результату метода или любого другого свойства, которое не является полем модели (то есть столбцом базы данных).Порядок должен быть выполнен в запросе к базе данных, чтобы все было просто и эффективно.

Цель admin_order_field состоит в том, чтобы приравнять упорядочение неполевого свойства к упорядочению чего-то, что является полем.

Например, допустимые значения current_owner.admin_order_field могут быть id, title или library_id.Очевидно, что ни один из них не имеет смысла для вашей цели.

Одним из решений будет денормализация и всегда хранить current_owner в качестве поля модели на Book;это можно сделать автоматически с помощью сигнала.

1 голос
/ 07 января 2011

Вы не можете сделать это. admin_order_field должно быть полем, а не методом - оно предназначено для случаев, когда у вас есть метод, который возвращает пользовательское представление базового поля, а не когда вы выполняете динамические вычисления для предоставления значения. Администратор Django использует ORM для сортировки, и он не может сортировать по пользовательским методам.

...