У меня есть вопрос относительно использования только одного представления или конечной точки для выполнения нескольких запросов. У нас есть 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
на самом деле является запросом?
Спасибо!