I am beginner to Django and currently, I can construct model like this.
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?
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.
The BaseSerializer class caches its data attribute on the object, but Serializer. data returns a copy of BaseSerializer.
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.
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_ROOT
and 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With