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

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

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

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

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'

person James    schedule 16.02.2014    source источник
comment
Вы можете сделать MyModel.objects.all().order_by('user__username')? Я имею в виду, забудьте на секунду сайт администратора, можете ли вы заказать объект QuerySet в соответствии с соответствующим именем пользователя, используя не-rel ORM (не python)?   -  person yuvi    schedule 16.02.2014


Ответы (1)


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

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

list_display = ('is_active', 'user__username')

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

person Peter DeGlopper    schedule 16.02.2014
comment
Извините, я забыл упомянуть, что использую не-rel бэкэнд (mongo), поэтому поиск по внешнему ключу не будет работать. Вот почему мне нужно было использовать метод get_username. Но вы уверены, что сортировка по методу модели не совсем возможна? - person James; 16.02.2014