2016-02-20 10 views
9

Django'ya yeni başlıyorum ve şu anda böyle bir model oluşturabilirim.Django, tam URL'yi almak için görüntü alanını serileştirir

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) 

fotoğraf için tam url göstermez. Tam URL’yi nasıl gösterebilirim?

+0

sizin MEDIA_ROOT dahilinde olmadığı sürece Statik klasörünüzde, dosyaya doğrudan bir URL yoktur. – jsfan

+0

SerializerMethodField'ı deneyin; http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield –

cevap

25

Django, models.ImageField'da saklanan görüntüye mutlak bir URL sağlamaz (en azından etki alanı adını MEDIA_URL'a dahil etmezseniz; etki alanı dahil, medya dosyalarınızı barındırmanız dışında, önerilmez) farklı bir sunucu (ör. aws)).

Ancak, özel bir serializers.SerializerMethodField kullanarak fotoğrafınızın mutlak URL dönmek için seri hale değiştirebilirsiniz.

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) 

Ayrıca Django'nın MEDIA_ROOTand MEDIA_URL parametrelerini ayarlamak olduğunu ve tarayıcınızda http://localhost:8000/path/to/your/image.jpg yoluyla fotoğraf erişebilirsiniz emin olun: Bu durumda, sizin serileştirici şöyle değiştirilmesi gerekir. senin views.py içinde seri hale initialising ederken işaret kazık gibi

, isteği eklemeniz gerekir: gelecek ziyaretçiler için

def my_view(request): 
    … 
    car_serializer = CarSerializer(car, context={"request": request}) 
    car_serializer.data 
+0

Ayrıca view.py dosyasında değişiklik yapmam gerekir mi? Serializers.py'deki birinizi değiştirdikten sonra hatam var. __init __() tam olarak 2 argüman alır (1 verilen) –

+0

İlgili kodu view.py dosyasına ekleyebilir misiniz? Herhangi bir değişiklik gerektiğini düşünmeyin. – blacklwhite

+0

Şimdi ekledim. Bir şey mi eksik? –

0

, görünüm ise serileştiriciye için başka bir alan eklemeye gerek yoktur yöntem zaten bir seri hale getirilmiş nesne döndürür. Gereken tek şey, köprüler oluşturmak için gereken beri drf documentation

@list_route() 
def my_view(self, request): 
    qs = Object.objects.all() 
    return Response(MySerializer(qs, many=True, context={'request': request}).data) 
1

seri hale sınıfında belirtildiği gibi bağlam eklemektir

class CarSerializer(serializers.ModelSerializer): 

    photo_url = serializers.ImageField(max_length=None, use_url=True, allow_null=True, required=False) 
    class Meta: 
     model = Car 
     fields = ('id','name','price', 'photo_url') 

Görünüm

class CarView(APIView): 

    def get(self, request, *args, **kwargs): 

     queryset = Car.objects.all() 

     serializer = CarSerializer(queryset, many=True, context={"request":request}) 

     return Response(serializer.data, status=status.HTTP_200_OK) 
İlgili konular