drf-effectular: как показать первичный ключ в разделе примеров Swagger
Я пытаюсь показать первичный ключ в разделе примеров Swagger, я использую drf-Spectrum, и мой код выглядит так:
Serializers.py
class SerializerExample(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('id','name')
Views.py
class BooksBulkUpdate(APIView):
@extend_schema(
request=SerializerExample(many=True),
responses={200:''},
)
def put(self, request, format=None):
with transaction.atomic():
for data in request.data:
book = Book.objects.get(pk=data['id'])
serializer = SerializerExample(book, data=data, partial=True)
if serializer.is_valid():
serializer.save()
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
return Response()
Отображается только поле имени:
Единственным решением, которое я нашел, было использование встроенного сериализатора, что не является идеальным решением, потому что, если я обновлю свой сериализатор книги, мне придется не забыть обновить также этот встроенный сериализатор. Интересно, есть ли лучший способ сделать это.
1 ответ
AFAIK swagger показывает схему входного запроса.
Например, вы хотите добавить новый
person
и ваша модель
class Person(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=30)
Итак, вы разрешили установить только
name
параметр
Даже если вы опубликуете
{
"id": "someUUID",
"name": "NAME",
}
будет проигнорирован, и Django создаст его автоматически по собственной логике (потому что он доступен только для чтения)
Но вы можете установить поле для записи:
class SerializerExample(serializers.ModelSerializer):
id = serializers.UUIDField(write_only=True)
name = serializers.CharField(write_only=True)
class Meta:
model = Person
fields = ('id','name')
write_only=True
означает, что поле будет активным при сохранении новых данных и получении из запроса json. Напротив
read_only=True
будет печатать поле при ответе (если вы пытаетесь получить данные), но проигнорируете его при сохранении новых данных.
Итак, вы пытаетесь описать API для добавления данных, и, конечно же, это не позволяет установить
id
поле в запросе json.
Не уверен, применима ли эта теория к вашему случаю, но надеюсь, что это будет полезно.