【问题标题】:drf mongoengine serializer imagefield nonedrf mongoengine 序列化程序 imagefield 无
【发布时间】:2019-02-14 01:31:22
【问题描述】:

我使用了 Django restframework 和 mongoengine。

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

[模型.py]

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))

[serializer.py]

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.py]

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。

但它抛出 None like this -> {'book_id': 1, 'image': None}

我的代码有错误吗?

谢谢。

【问题讨论】:

  • Book 类是否有 image 字段或属性?如果没有,BookSerializer 上的 ImageField 将变为 None 值或导致错误,因为没有可参考的内容。
  • @YongjinJo No. Book 类没有image 归档。因为我只想通过序列化程序验证用户输入。所以我在serializers.py中定义了image = ImageField()
  • 我明白了。但在您看来,您使用的是AppealSerializer 而不是BookSerializer 来设置request.data。我错过了什么吗?
  • @YongjinJo 对不起,在复制代码时,我插入了错误的代码。但在我的工作代码中是BookSerializer。我们可以聊天吗? chat.stackoverflow.com/rooms/188373/drfdrf

标签: django django-rest-framework mongoengine django-serializer


【解决方案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)

【讨论】:

    猜你喜欢
    • 2020-06-21
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    相关资源
    最近更新 更多