Администратор Django: упорядочивается по соответствующему внешнему ключу

Я пытаюсь сортировать страницу списка администраторов Django по определенному значению в соответствующем внешнем наборе объектов.

В частности, в приведенном ниже коде я хочу, чтобы в представлении ContentAdmin отображался список всех объектов контента, отсортированных по значению «Twitter Score» (объект Score с именем «Twitter»).

В приложении django у меня есть следующие модели:

class Content(models.Model): body = models.CharField(max_length=564) title = models.CharField(max_length=64) class Score(models.Model): name = models.CharField(max_length=64) score = models.IntegerField() content = models.ForeignKey('Content') 

И в admin.py у меня есть следующее:

 class ContentAdmin(admin.ModelAdmin): list_display = ('title', 'show_twitter_score',) def show_twitter_score(self, obj): twitter_score = obj.score_set.get(name='Twitter') return 'Twitter: ' + str(twitter_score.score) 

ЦЕЛЬ: панель администратора для ContentAdmin отображает объекты контента, упорядоченные по показателям «Twitter»

Всем спасибо!

  • kivy с ошибкой импорта pycharm
  • Как я могу вывести вывод subprocess.call () в терминал и файл?
  • async wait / non blocking wait в python
  • Получить список / tuple / dict аргументов, переданных функции?
  • Как я могу увидеть подробности исключения в отладчике Python?
  • Python: создание словаря из текста / файла в формате словаря
  • Как получить доступ к request.user в методе класса Piston
  • как рисовать ориентированные графики с помощью networkx в python?
  • 3 Solutions collect form web for “Администратор Django: упорядочивается по соответствующему внешнему ключу”

    Я решил это, расширив метод ContentAdmin класса ContentAdmin . После этого речь шла только о получении правильного запроса ORM

     def def get_queryset(self, request): qs = super(ContentAdmin, self).get_queryset(request) return qs.filter(score__name='Twitter').order_by('-score__score') 

    Для Django 1.5 и ранее метод был queryset .

     def queryset(self, request): qs = super(ContentAdmin, self).queryset(request) return qs.filter(score__name='Twitter').order_by('-score__score') 

    Если я правильно понял, вы можете попробовать это из ModelAdmin.list_display в документации Django:

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

    Однако, если элемент list_display представляет определенное поле базы данных, вы можете указать этот факт, установив атрибут admin_order_field элемента.

    Например:

     class Person(models.Model): first_name = models.CharField(max_length=50) color_code = models.CharField(max_length=6) def colored_first_name(self): return '<span style="color: #%s;">%s</span>' % (self.color_code, self.first_name) colored_first_name.allow_tags = True colored_first_name.admin_order_field = 'first_name' class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'colored_first_name') 

    Вышеуказанное будет сообщать Django о заказе по полю first_name при попытке сортировать по цвету_first_name в админе.

    Вы можете попробовать это обходное решение в своем коде для сортировки.

    Поскольку django admin использует db для сортировки сортировки, вы не можете сортировать функцию, которую вы показываете в списке.

    Что вы можете сделать, так это добавить столбец, который вы хотите показать, в набор запросов, который администратор django использует для отображения ваших моделей, таким образом, вы можете сортировать.

    Чтобы добавить нужный столбец, вам нужно использовать дополнительный метод queryset.

    Это должно сделать трюк 🙂

     Content.objects.all().extra(select={'twitter_score': 'SELECT score from content_score WHERE content_score.id = content_content.id'}) 

    БОНУСНЫЙ КРУГЛЫЙ:

    Content.objects.all (). Extra (select = {'twitter_score': 'SELECT' Оценка в Twitter: '|| оценка от content_score WHERE content_score.id = content_content.id'})

    Interesting Posts

    Четкое документированное чтение функций электронной почты с помощью python win32com outlook

    Есть ли клиент WebSocket для python?

    Иногда приложение для фляжки висит

    python pandas: график гистограмм дат?

    регулярное выражение python соответствует только последнему вхождению

    Могу ли я создавать маркер / дополнение GtkBox только с помощью CSS?

    Почему я получаю «python int too large to convert to C long», когда я использую DateFormatter от matplotlib для форматирования дат на оси x?

    Детский процесс, обнаруживающий смерть родительского процесса в Python

    Использование многопроцессорной обработки python приводит к зависанию на пулеметном

    Чтение в CSV-файле как dataframe из hdfs

    Python: постройте множество графиков на том же рисунке

    Какой самый пифонический способ вывести случайный элемент из списка?

    Кодирование Python – не удалось декодировать до utf8

    как генерировать числа с учетом их основных факторов, но с неизвестными показателями?

    python, связанный с Nonetype перед литьем \ сложение

    Python - лучший язык программирования в мире.