0

I used Django restframework and mongoengine.

Here is my model and serializer.

[model.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',
        )

Work flow like this.

  1. Upload image to s3

  2. Get s3 path

  3. Save s3 path to attachments field in models.py.

So do not defined attachments to ImageField() in models.py.

Just set image = ImageField() in serializer to validate it is correct image.

But when I validate with serializer.is_valid(), image get 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)

As you know that after serializer.is_valid(), I printed serializer.data.

But it throw None like this -> {'book_id': 1, 'image': None}

Is there any error in my code?

Thanks.

Hide
  • 3,199
  • 7
  • 41
  • 83
  • Does `Book` class have `image` field or property? If not, `ImageField` on `BookSerializer` becomes a `None` value or causes an error because there is nothing to refer to. – Jrog Feb 14 '19 at 01:54
  • @YongjinJo No. `Book` class do not have `image` filed. Because I just want to validate user input via serializer. So I defined `image = ImageField()` in `serializers.py`. – Hide Feb 14 '19 at 01:56
  • I understand. But in your view, you are using `AppealSerializer` not `BookSerializer` to set `request.data`. Am I missing something? – Jrog Feb 14 '19 at 02:03
  • @YongjinJo Sorry, while copy code, I insert wrong code. But in my work code is `BookSerializer`. Can we talk on chat? https://chat.stackoverflow.com/rooms/188373/drfdrf – Hide Feb 14 '19 at 02:06

1 Answers1

1

Problem is solved in chat room. Just use 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)
Jrog
  • 1,469
  • 10
  • 29