2016-02-20 8 views
9

Ich bin Anfänger zu Django und zZ kann ich Modell so bauen.Django Bildfeld serialisieren, um volle URL zu erhalten

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) 

für Foto, es zeigt nicht vollständige URL. Wie kann ich die vollständige URL anzeigen?

+0

Sofern Ihr MEDIA_ROOT innerhalb ist In Ihrem statischen Ordner gibt es keine direkte URL zu der Datei. – jsfan

+0

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

Antwort

25

Django liefert keine absolute URL für das in einem models.ImageField gespeicherte Bild (zumindest wenn Sie den Domain-Namen nicht in die MEDIA_URL einschließen; einschließlich der Domain ist nicht zu empfehlen, außer dass Sie Ihre Mediendateien hosten ein anderer Server (zB aws)).

Sie können jedoch Ihren Serializer so ändern, dass die absolute URL Ihres Fotos mit einer benutzerdefinierten zurückgegeben wird. In diesem Fall muss Ihr Serializer geändert werden, wie folgt:

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) 

auch sicher, dass Sie MEDIA_ROOTand MEDIA_URL Parameter Djangos gesetzt haben und dass Sie ein Foto über Ihren Browser http://localhost:8000/path/to/your/image.jpg zugreifen können.

Als Aufschichten darauf hingewiesen, müssen Sie die Anforderung hinzufügen, während die Serializer in Ihrem views.py Initialisierung:

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

Muss ich auch in views.py ändern? Ich habe einen Fehler, nachdem ich Ihren in Serializers.py geändert habe. __init __() benötigt genau 2 Argumente (1 angegeben) –

+0

Können Sie den zugehörigen Code in der Datei views.py hinzufügen? Denke nicht, dass irgendwelche Änderungen erforderlich sein sollten. – blacklwhite

+0

Ich habe jetzt hinzugefügt. Fehle ich etwas? –

0

Für zukünftige Besucher gibt es keine Notwendigkeit, ein weiteres Feld den Serializer, wenn die Ansicht hinzufügen Methode gibt bereits ein serialisiertes Objekt zurück. Das einzige, was erforderlich ist, um den Kontext zu addieren, da es erforderlich ist, Hyperlinks zu erzeugen, wie in der drf documentation

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

Serializer Klasse

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') 

Ansicht

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) 
Verwandte Themen