Использование класса mixins, определенного во фреймворке Django rest

Каково фактическое использование класса Mixins? Я не очень понимаю. Все классы Mixins, такие как CreateModelmixin, Listmixin и т.д. уже доступны в представлении на основе класса, например ListCreateApiView.

Например:

class ExampleView(ListCreateAPIView
                 DestroyAPIView,
               RetrieveUpdateAPIView):
    queryset = Example.objects.all()
    serializer_class = ExampleSerializer
    pagination_class = CustomPageNumberPagination

Используя миксины, мы можем сделать это следующим образом:

class ExampleView(ListAPIView,
                     mixins.CreateModelMixin):
        queryset = Example.objects.all()
        serializer_class = ExampleSerializer
        pagination_class = CustomPageNumberPagination

Когда я проверяю https://www.cdrf.co/, я вижу, что методы, доступные в CreateModelMixing, следующие:

def create(self, request, *args, **kwargs): 
def get_success_headers(self, data): 
def perform_create(self, serializer):

Эти методы уже доступны в ListCreateApiView, тогда зачем Django создал этот бесполезный класс?

Класс ListCeateAPIView использует миксин CreateModelMixin . Действительно, взгляните на Ancestors (Method Resolution Order; MRO) из ListCreateAPIView [classy-drf]. Он содержит CreateModelMixin.

Большинство APIView, созданных Django, представляют собой просто APIView и кучу миксинов. Эти миксины определяют фактическое поведение. ListCreateAPIView (и другие подклассы APIView) - это просто пакеты миксинов и APIView.

Это также является случаем использования миксина: смешивание определенной логики в классе. Существует множество APIView, которые позволяют создать объект, например CreateAPIView, ListCreateAPIView и ModelViewSet. Вместо того чтобы реализовывать одну и ту же логику во всех этих классах или работать с наследованием базового класса, которое будет только линейным, можно смешать ее во всех иерархиях, используя миксин, реализующий эту логику.

Также полезно работать с этими миксинами, если вы, например, хотите самостоятельно построить подкласс APIView, который делает что-то сложное, и в то же время добавить логику для ручки create, которая не делает таких сложных вещей.

Однако, если вы используете миксин, он обычно записывается перед базовым классом, так:

#              mixin first 🖟
class ExampleView(mixins.CreateModelMixin, ListAPIView):
    # …

это необходимо, поскольку миксины часто могут переопределять существующие методы, и поэтому миксин должен иметь приоритет в MRO над базовым классом.

Вернуться на верх