Django REST Framework, разные сериализаторы в одном GenericView - PullRequest
2 голосов
/ 24 марта 2020

У меня есть вопрос относительно использования только одного представления или конечной точки для выполнения нескольких запросов. У нас есть URL-адрес, определенный как

path('ap/', APIndex.as_view())

, где мы хотели бы получить все наши модели точек доступа и создать новую.

Мы проверили ссылку здесь , в основном ответ, в котором Мохаммад Масуми упомянул метод get_serializer_class и использование обобщенных c представлений.

Однако это не сработало, так как мы получаем следующее сообщение об ошибке при выполнении простого запроса GET по указанному выше URL.

AttributeError at /ap/
'APIndex' object has no attribute 'action'

Это происходит в нашем файле views_ap.py в методе get_serializer_class. Я не смог ни напечатать себя, чтобы увидеть, какой объект у меня там был.

Вы найдете ниже наших views_ap.py и serializers_ap.py:

views_ap.py:

from rest_framework import generics
from ..models.model_ap import AP
from ..serializers.serializers_ap import *
from ..serializers.serializers_user import *

class APIndex(generics.ListCreateAPIView):
   """List all ap, or create a new ap."""

   # serializer_classes = {
   #     'get': APIndexSerializer,
   #     'post': UserIDSerializer,
   #     # ... other actions
   # }
   queryset = AP.objects.all().order_by('id')

   # mapping serializer into the action
   serializer_classes = {
       'list': APIndexSerializer,
       'create': APCreateSerializer
   }

   default_serializer_class = APIndexSerializer # Default serializer

   def get_serializer_class(self):
       print(self)
       return self.serializer_classes.get(self.action, self.default_serializer_class)

serializers_ap.py:

from rest_framework import serializers
from ..models.model_ap import AP
from .serializers_user import *


class APIndexSerializer(serializers.ModelSerializer):
    user = UserIndexSerializer()

    class Meta:
        model = AP
        fields = [
            'id',
            'user',
            'name'
        ]

    def to_representation(self, obj):
        self.fields['user'] = UserIndexSerializer()
        return super(APIndexSerializer, self).to_representation(obj)

class APCreateSerializer(serializers.ModelSerializer):
    # user = UserIDSerializer()

    class Meta:
        model = AP
        fields = [
            'user',
            'name'
        ]

    def create(self, validated_data):
        ap = AP.objects.create(**validated_data)
        return ap

Будучи новичком в Django У меня действительно есть несколько вопросов, чтобы лучше понять это:

  • Это Можно ли определить тип запроса с помощью Generi c представлений (GET, POST et c.)?
  • Если да, то как это сделать?
  • Я правильно понимаю, что объект self в методе get_serializer_class на самом деле является запросом?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...