Reputation: 327
I am new to DRF, I have this serializer, but I am not able to create the post as it keeps showing me this in postman even after uploading an image to that field. In normal django, this PostImage model has a foreign key relation to Post and I use a formset to upload multiple images.
{
"postimage": [
"This field is required."
]
}
Can someone help me to resolve this and tell me how it works?
serializer.py
class PostImageSerializer(serializers.ModelSerializer):
class Meta:
model = PostImage
fields = ['id','post', 'images',]
class PostCreateSerializer(serializers.ModelSerializer):
postimage = PostImageSerializer(many=True)
class Meta:
model = Post
fields = ['id','title', 'image', 'postimage',]
views.py
def create_post_api_view(request):
user = request.user
post = Post(user=user)
serializer = PostCreateSerializer(post, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
UPDATE:
payload.
Authorization: Token XXXX
:
User-Agent: PostmanRuntime/7.26.2
Accept: */*
Postman-Token: 066c9a26-af76-4a44-9e9f-a3326050fa"
Host: 127.0.0.1:8000
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: multipart/form-data; boundary=--------------------------554448102853056787089432
Content-Length: 123293
Request Body
title: "Another Trial api posts"
image: {…}
_events: {}
_eventsCount: 3
_readableState: {…}
autoDestroy: false
awaitDrain: 0
buffer: {…}
head: null
length: 0
tail: null
decoder: null
defaultEncoding: "utf8"
destroyed: true
emitClose: false
emittedReadable: false
encoding: null
endEmitted: true
ended: true
flowing: true
highWaterMark: 65536
length: 0
needReadable: false
objectMode: false
paused: false
pipes: null
pipesCount: 0
readableListening: false
reading: false
readingMore: false
resumeScheduled: false
sync: false
autoClose: true
bytesRead: 5473
closed: true
fd: null
flags: "r"
mode: 438
path: "C:\Users\danny\Desktop\test images\cat.jpg"
readable: false
postimage: [2]
0: {…}
_events: {}
_eventsCount: 3
_readableState: {…}
autoDestroy: false
awaitDrain: 0
buffer: {…}
decoder: null
defaultEncoding: "utf8"
destroyed: true
emitClose: false
emittedReadable: false
encoding: null
endEmitted: true
ended: true
flowing: true
highWaterMark: 65536
length: 0
needReadable: false
objectMode: false
paused: false
pipes: null
pipesCount: 0
readableListening: false
reading: false
readingMore: false
resumeScheduled: false
sync: false
autoClose: true
bytesRead: 7350
closed: true
fd: null
flags: "r"
mode: 438
path: "C:\Users\danny\Desktop\test images\041520_mt_supernova_feat-1028x579.jpg"
readable: false
1: {…}
_events: {}
_eventsCount: 3
_readableState: {…}
autoDestroy: false
awaitDrain: 0
buffer: {…}
decoder: null
defaultEncoding: "utf8"
destroyed: true
emitClose: false
emittedReadable: false
encoding: null
endEmitted: true
ended: true
flowing: true
highWaterMark: 65536
length: 0
needReadable: false
objectMode: false
paused: false
pipes: null
pipesCount: 0
readableListening: false
reading: false
readingMore: false
resumeScheduled: false
sync: false
autoClose: true
bytesRead: 109530
closed: true
fd: null
flags: "r"
mode: 438
path: "C:\Users\danny\Desktop\test images\Tischvase-X-Form-VX-silber-dek-Holst-Porzellan.jpg"
readable: false
Response Headers
Date: Mon, 27 Jul 2020 10:09:18 GMT
Server: WSGIServer/0.2 CPython/3.8.2
Content-Type: application/json
Vary: Accept, Accept-Language, Cookie
Allow: POST, OPTIONS
X-Frame-Options: SAMEORIGIN
Content-Length: 41
Content-Language: en
Response Body
{"postimage":["This field is required."]}
updated createserializer
class PostCreateSerializer(serializers.ModelSerializer):
images = serializers.ImageField()
class Meta:
model = Post
fields = ['id','title','image', 'images',]
def create(self,validated_data):
user = self.context['request'].user
title = validated_data['title']
image = self.context['request'].FILES.get('image')
images = self.context['request'].FILES.get('images')
m1 = Post(
title=title,
image=image,
user=user
)
m1.save()
m2 = PostImage(
post=m1,
images=images
)
m2.save()
validated_data['images']=m2.images
return validated_data
Response based on the last edit
{
"title": "Another Trial api posts",
"image": null,
"images": "http://127.0.0.1:8000/media/posts/postimage/Tischvase-X-Form-VX-silber-dek-Holst-Porzellan.jpg"
}
now the other image is null..
Thanks
Upvotes: 0
Views: 741
Reputation: 332
I think you should write your own create method for your serializer. Something like this
models
class MyModel(models.Model):
field1 = models.CharField(max_length=50)
def __str__(self):
return str(self.field1)
class MyModel2(models.Model):
field2 = models.CharField(max_length=50)
image = models.ImageField(upload_to='images')
foreignkeytomymodel = models.ForeignKey(MyModel,on_delete=models.CASCADE)
def __str__(self):
return str(self.field2)
serializers
class MyModelSerializer(serializers.ModelSerializer):
field2 = serializers.CharField(required=True)
image = serializers.ImageField(required=True)
class Meta:
model = MyModel
fields = ['field1','field2', 'image']
def create(self,validated_data):
field1 = validated_data['field1']
field2 = validated_data['field2']
image = self.context['request'].FILES.get('image')
m1 = MyModel(
field1=field1
)
m1.save()
m2 = MyModel2(
field2=field2,
image=image,
foreignkeytomymodel=m1
)
m2.save()
validated_data['field2']=m2.field2
validated_data['image']=m2.image
return validated_data
views
serializer = MyModelSerializer(data=request.data, context={'request':request})
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400)
Update Based on your Serializer -
class PostCreateSerializer(serializers.ModelSerializer):
images = serializers.ImageField()
class Meta:
model = Post
fields = ['id','title','image', 'images',]
def create(self,validated_data):
user = self.context['request'].user
title = validated_data['title']
image = self.context['request'].FILES.get('image')
images = self.context['request'].FILES.get('images')
m1 = Post(
title=title,
image=image,
user=user
)
m1.save()
m2 = PostImage(
post=m1,
images=images
)
m2.save()
validated_data['image']=m1.image
validated_data['images']=m2.images
return validated_data
Upvotes: 3