2016-02-20 7 views
9

प्राप्त करने के लिए छवि क्षेत्र को क्रमबद्ध करता है मैं डीजेगो से शुरुआत कर रहा हूं और वर्तमान में, मैं इस तरह के मॉडल का निर्माण कर सकता हूं।डीजेंगो पूर्ण यूआरएल

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) 

तस्वीर के लिए, यह पूर्ण यूआरएल नहीं दिखाती है। मैं पूरा यूआरएल कैसे दिखा सकता हूं?

+0

जब तक आपकी MEDIA_ROOT के भीतर है आपका स्थिर फ़ोल्डर, फ़ाइल के लिए कोई सीधा यूआरएल नहीं है। – jsfan

+0

SerializerMethodField आज़माएं; http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield –

उत्तर

25

Django में संग्रहीत छवि के लिए एक पूर्ण URL प्रदान नहीं कर रहा है एक models.ImageField (कम से कम अगर आप MEDIA_URL में डोमेन नाम शामिल नहीं है, डोमेन सहित अनुशंसित नहीं है, तो आप पर अपनी मीडिया फ़ाइलों को होस्ट कर रहे हैं के अलावा एक अलग सर्वर (जैसे aws))।

हालांकि, आप अपने सीरिएलाइज़र को कस्टम 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_ROOTand MEDIA_URL मानकों की स्थापना की है और आप अपने ब्राउज़र http://localhost:8000/path/to/your/image.jpg के माध्यम से एक तस्वीर का उपयोग कर सकते है कि बनाने: इस मामले में, अपने serializer इस प्रकार परिवर्तित करने की जरूरत है।

पाइलिंग ने बताया के रूप में, यदि आप अपने views.py में serializer initialising अनुरोध जोड़ने की जरूरत:

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

क्या मुझे views.py में भी संशोधित करने की आवश्यकता है? Serializers.py में अपना एक बदलने के बाद मुझे त्रुटि मिली। __init __() बिल्कुल 2 तर्क लेता है (1 दिया गया) –

+0

क्या आप views.py में संबंधित कोड जोड़ सकते हैं? ऐसा मत सोचो कि किसी भी बदलाव की आवश्यकता होनी चाहिए। – blacklwhite

+0

मैंने अभी जोड़ा है। क्या मैं कुछ भूल रहा हूँ? –

0

भविष्य आगंतुकों के लिए, वहाँ serializer दृश्य यदि करने के लिए एक और क्षेत्र को जोड़ने के लिए कोई जरूरत नहीं है विधि पहले से ही एक धारावाहिक वस्तु देता है। केवल एक चीज के रूप में आवश्यक drf documentation

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

Serializer वर्ग में कहा गया है के बाद से यह हाइपरलिंक उत्पन्न करने के लिए की जरूरत है प्रसंग जोड़ने के लिए, है

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

देखें

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) 
संबंधित मुद्दे