Django将imagefield序列化以获取完整的URL [英] Django serialize imagefield to get full url
问题描述
我是Django的初学者,目前我可以构建这样的模型。
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
CarSerializer(serializers.ModelSerializer):
class Meta:
model = Car
fields =('id','name','price','photo')
Views.py
CarView(APIView):
permission_classes =()
def get(self,request):
car = Car.objects.all()
serializer = CarSerializer(car)
返回n响应(serializer.data)
对于照片,它不显示完整的URL。如何显示完整的网址?
Django没有为存储在 models.ImageField
(至少如果您不在 MEDIA_URL
;包括域名不推荐!)。
但是,您可以通过使用自定义的 serializers.SerializerMethodField
。在这种情况下,您的序列化器需要更改如下:
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 )
还要确保你已经设置了Django的 MEDIA_ROOT
和 MEDIA_URL
参数,您可以通过浏览器访问照片 http:// localhost:8000 / path / to / your / image.jpg
。 / p>
正如打桩所指出的,您需要在您的views.py中初始化序列化程序时添加请求:
def my_view(request):
...
car_serializer = CarSerializer(car,context = {request:request})
car_serializer.data
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?
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!).
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
这篇关于Django将imagefield序列化以获取完整的URL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!