Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django serializer Imagefield to get full URL

I am beginner to Django and currently, I can construct model like this.

enter image description here

models.py

class Car(models.Model):     name = models.CharField(max_length=255)     price = models.DecimalField(max_digits=5, decimal_places=2)     photo = models.ImageField(upload_to='cars') 

serializers.py

class CarSerializer(serializers.ModelSerializer):     class Meta:         model = Car         fields = ('id','name','price', 'photo')  

views.py

class CarView(APIView):     permission_classes = ()     def get(self, request):         car = Car.objects.all()         serializer = CarSerializer(car)         return Response(serializer.data) 

For photo, it doesn't show full URL. How can I show full URL?

like image 213
Khant Thu Linn Avatar asked Feb 20 '16 11:02

Khant Thu Linn


People also ask

What does serializer Is_valid do?

is_valid perform validation of input data and confirm that this data contain all required fields and all fields have correct types. If validation process succeded is_valid set validated_data dictionary which is used for creation or updating data in DB.

What does serializer data return?

The BaseSerializer class caches its data attribute on the object, but Serializer. data returns a copy of BaseSerializer.

What is difference between serializer and ModelSerializer?

The ModelSerializer class is the same as a regular Serializer class, except that: It will automatically generate a set of fields for you, based on the model. It will automatically generate validators for the serializer, such as unique_together validators.


1 Answers

Django is not providing an absolute URL to the image stored in a models.ImageField (at least if you don't include the domain name in the MEDIA_URL; including the domain is not recommended, except of you are hosting your media files on a different server (e.g. aws)).

However, you can modify your serializer to return the absolute URL of your photo by using a custom serializers.SerializerMethodField. In this case, your serializer needs to be changed as follows:

class CarSerializer(serializers.ModelSerializer):     photo_url = serializers.SerializerMethodField()      class Meta:         model = Car         fields = ('id','name','price', 'photo_url')       def get_photo_url(self, car):         request = self.context.get('request')         photo_url = car.photo.url         return request.build_absolute_uri(photo_url) 

Also make sure that you have set Django's MEDIA_ROOTand MEDIA_URL parameters and that you can access a photo via your browser http://localhost:8000/path/to/your/image.jpg.

As piling pointed out, you need to add the request while initialising the serializer in your views.py:

def my_view(request):     …     car_serializer = CarSerializer(car, context={"request": request})     car_serializer.data 
like image 169
blacklwhite Avatar answered Sep 26 '22 00:09

blacklwhite