Как переопределить метод .create () в универсальном представлении (пример: ListCreateAPIView) в django-rest-framework? - PullRequest
0 голосов
/ 28 июня 2018

Я хотел переопределить метод create в представлении на основе классов, который реализует ListCreateAPIView, обычно не при переопределении таких методов, как метод get_queryset(self), запросы, URL **kwargs доступны из self, но Я хотел переопределить .create() метод CreateModelMixin, поэтому я взглянул на код, чтобы найти сигнатуру как create(self, request, *args, **kwargs), что django передает в **kwargs, *args этой функции? эти URL **kwargs случайно? Как мне переопределить метод create в универсальном представлении, когда request в любой функции универсального представления осуществляется доступ из self, но для подписи функции create явно требуется аргумент запроса.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019
from rest_framework import generics

from tasks.models import Task
from tasks.serializers import TaskSerializer


class TaskList(generics.ListCreateAPIView):
    queryset = Task.objects.all()
    serializer_class = TaskSerializer

    def create(self, request, *args,**kwargs):
        # your implementation
        return Response(response)
0 голосов
/ 29 июня 2018

Ниже следует DRF ListCreateAPIView , как вы можете видеть, *args, **kwargs напрямую передается от стандартного post метода:

class ListCreateAPIView(mixins.ListModelMixin,
                    mixins.CreateModelMixin,
                    GenericAPIView):
    """
    Concrete view for listing a queryset or creating a model instance.
    """
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

Теперь, говоря о переопределении create из CreateModelMixin, вы можете просто переопределить его как:

from rest_framework import generics

class YourWonderfulView(generics.ListCreateAPIView):

    queryset = YourModelClass.objects.all()
    serializer_class = YourSerializer

    def create(self, request, *args, **kwargs): # don't need to `self.request` since `request` is available as a parameter.

        # your custom implementation goes here

        return Response(response) # `response` is your custom response – e.g. dict, list, list of dicts etc

Надеюсь, это поможет:)

...