drf其他序列化器imagefield none

问题描述 投票:0回答:1

我使用了Django restframework和其他人。

这是我的模型和序列化器。

[model.朋友]

class Attachment(EmbeddedDocument):
    attachment_id = SequenceField()
    path = StringField()
    path_small = StringField()

class Book(Document):
    book_id = SequenceField()
    user_id = LongField(required=True)
    attachments = ListField(EmbeddedDocumentField(Attachment))
    created_at = DateTimeField(default=datetime.now().replace(microsecond=0))
    updated_at = DateTimeField(default=datetime.now().replace(microsecond=0))

[serialize人.朋友]

from rest_framework_mongoengine.serializers import DocumentSerializer
from rest_framework.serializers import ImageField
from books.models.mongo import Book

class BookSerializer(DocumentSerializer):
    image = ImageField()
    class Meta:
        model = Appeal
        fields = (
            'book_id',
            'image',
        )

像这样的工作流程。

  1. 将图片上传到s3
  2. 获取s3路径
  3. 将s3路径保存到models.py中的attachments字段。

所以不要在models.py中定义ImageField()的附件。

只需在序列化器中设置image = ImageField()即可验证它是否正确。

但是当我用serializer.is_valid()验证时,图像得到了None

[views.朋友]

class BookList(GenericAPIView):
    serializer_class = BookSerializer
    queryset = ''

    def post(self, request: Request) -> Union[Response, NoReturn]:
        serializer = BookSerializer(data=request.data)
        if serializer.is_valid():
            print(serializer.data)
            appeal = CreateAppealInteractor().execute(request=serializer.data)
            return Response(status=status.HTTP_200_OK)

如你所知,在serializer.is_valid()之后,我打印了serializer.data。

但它会像这样抛出无 - > {'book_id': 1, 'image': None}

我的代码中有错误吗?

谢谢。

django django-rest-framework mongoengine django-serializer
1个回答
1
投票

问题在聊天室得到解决。只需使用validated_data

class BookList(GenericAPIView):
    serializer_class = BookSerializer
    queryset = ''

    def post(self, request: Request) -> Union[Response, NoReturn]:
        serializer = BookSerializer(data=request.data)
        if serializer.is_valid():
            appeal = CreateAppealInteractor().execute(request=serializer.validated_data)
            return Response(status=status.HTTP_200_OK)
© www.soinside.com 2019 - 2024. All rights reserved.