Как отсортировать административный столбец Django в поле метода модели (а не в поле модели)

Я следовал за некоторыми вопросами на этом сайте, чтобы добавить новый столбец в админке Django на основе модельного метода. Работает отлично. Однако я не могу отсортировать по столбцу. Есть ли способ выполнить сортировку в поле метода модели, где нет поля физической модели для ссылки?

Например, один метод ищет отношение внешнего ключа к другой модели и возвращает строки. Они могут быть отсортированы по алфавиту. Другой пример проверяет, активна ли модель на основе того, есть ли дата завершения или нет. (Очевидно, я могу легко добавить boolean поле для модели, но я хочу знать, если это можно сделать, просто используя методы). Есть ли способ включить сортировку по этим "столбцам"?

Обновление: это не относящийся к бэкэнду (монго), поэтому поиск по внешнему ключу не будет работать изначально.

Ex.

class mymodel(models.Model):
    user = models.ForeignKey(User)
    termination_date = models.DateTimeField(blank=True, null=True)

    # Useful admin view methods
    # Returns whether the model is currently active.
    def is_active(self):
        if self.termination_date:
            return False
        else:
            return True

    is_active.boolean = True
    is_active.admin_order_field = 'termination_date' #<--- This activates sort, but not on the boolean, it sorts on the Model Field termination_date.

    # Returns the username from foreign key relationship
    def get_username(self):
        return User.objects.get(pk=self.user_id).username

    get_username.short_description = 'user'

1 ответ

Администратор использует базу данных для сортировки результатов, поэтому, если ваш метод не может быть сопоставлен непосредственно с полем базы данных (как ваш пример с admin_order_field показывает) вы не можете сортировать по нему.

Тем не менее, ваш get_username метод не нужен - его можно заменить поиском внешнего ключа. Начиная с 1.3 (я думаю) можно использовать стандартную __ ссылки на поля в настройках администратора, например:

list_display = ('is_active', 'user__username')

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

Другие вопросы по тегам