DJango filter_queryset - PullRequest
       19

DJango filter_queryset

0 голосов
/ 19 декабря 2018

Я новичок в DJango и DRF, и меня попросили управлять кодом, связанным с DJango / DRF.После долгих поисков я все еще не могу найти полный пример того, как работает filter_queryset и как его можно использовать с другими аргументами.

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

self.filter_queryset(queryset)

и в других местах используется с некоторыми аргументами.Было бы полезно, если бы кто-то мог объяснить основные принципы, такие как, как и когда его использовать, каковы зависимые переменные (lookup_field, filter_backends и т. Д.) И аргументы и как их настроить.

У меня естьмного искал, а также просмотрел документы.Если я пропустил любой документ, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 19 декабря 2018

filter_queryset() - (исходный код) - это метод, который первоначально был реализован в GenericAPIView - (DRF doc) класс.

def filter_queryset(self, queryset):
    """
    Given a queryset, filter it with whichever filter backend is in use.
    You are unlikely to want to override this method, although you may need
    to call it either from a list view, or from a custom `get_object`
    method if you want to apply the configured filtering backend to the
    default queryset.
    """
    for backend in list(self.filter_backends):
        queryset = backend().filter_queryset(self.request, queryset, self)
    return queryset

Я думаю, что функциональность метода хорошо видна из строк документа.


"..... и в других местах он используется с некоторыми аргументами"

views s filter_queryset() метод принимаеттолько один параметр, который является queryset для фильтрации.

Но, метод filter-backends 'filter_queryset() принимает три аргумента: request, queryset и view.


Что такое FilterBackends?
Filterbackends - это классы, которые помогаютнам нужно отфильтровать набор запросов со сложными поисками и другими вещами.

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

Как работает фильтр-бэкэнд?
Взгляните на исходный код класса DjangoFilterBackend и его методы ..Метод .It's filter_queryset(...) играет ключевую роль в процессе фильтрации.
Я бы рекомендовал просмотреть документ django-filter , чтобы понять, как использовать то же самое с другими примерами.

Путем определения filterset_class, вы можете лучше контролировать процесс фильтрации (например, lookup_expr и т. Д.)

...