Фильтры list_filters не работают с переопределенным набором get_query в Admin list_view, если он содержит объединение - PullRequest
0 голосов
/ 24 марта 2020

Мне нужно было создать Django Admin list_view страницу с переопределенным методом get_queryset(), который будет объединять разные модели на одну и ту же страницу.
Но после того, как я обновил ее, list_filter перестал работать.

Как я выяснил, если вы используете union() - Django не позволяет выполнять дальнейшую фильтрацию (только LIMIT, OFFSET, COUNT(*), ORDER BY SQL операций).
И почему-то применение этих фильтров реализовано после вызова get_queryset(). Я думал, что вызов super().get_queryset(request) в моем ModelAdmin.get_queryset() вернет уже проанализированные данные.

UPD: В этой ситуации никакие работающие фильтры и набор запросов в действиях не всегда содержат все записи модели, даже если немногие выбрали только несколько.


class Model1():
    pass


class ModelA():
    x = models.ForeignKey(Model1)


class ModelB():
    x = models.ForeignKey(Model1)


class Model1Admin():
    list_display = (...)
    list_filters = (...)  # These will not work
    list_actions = (...)  # These will not work

    def get_queryset():
        qs_a = Model1.prefetch_related('ModelA')
        qs_b = Model1.prefetch_related('ModelB')
        return qs_a.union(qs_b)

Вопросы:

  1. Есть ли какой-нибудь простой способ, как получить набор запросов с уже примененным list_filters и после выполнения пользовательской фильтрации и объединения?
  2. Это ошибка в Django Framework сама по себе, и об этом следует сообщать в их баг-трекере?
...