Как отсортировать административный столбец 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
для вашего метода.