2015-09-11 3 views
0

Я новичок в python и поэтому django. Я добавил поле изображения в моей модели ...URL-адрес поля изображения изменяется, как только я переопределяю метод списка в видах Django

class Entry(models.Model): 
    title = models.CharField(max_length=255) 
    body = MarkdownField() 
    image = models.ImageField(upload_to='images',null=True,blank=True) 

Тогда, когда я пишу простой вид Джанго остальное вроде как показано на рисунке, он отлично работает.

class EntryView(viewsets.ModelViewSet): 
    queryset = Entry.objects.all() 
    serializer_class = EntrySerializer 

Здесь поле изображения в Джанго API покоя показывается как:

«образ»: «http://localhost:8000/media/images/x_4.jpg»,

Теперь, когда я переопределить список mthod в виду сервер URL-адрес часть, то есть «http://localhost:8000» исчез, а оставшаяся часть оставлена. Новый взгляд, как я уже говорил это:

class EntryView(viewsets.ModelViewSet): 
    queryset = Entry.objects.all() 
    serializer_class = EntrySerializer 
    lookup_field = 'title' 

    def list(self, request,*kwargs): 
     queryset=Entry.objects.filter(publish=True) 
     serializer = EntrySerializer(queryset,many=True) 
     return Response(serializer.data) 

и поле изображения в Джанго API остальное, как я уже говорил, становится этим:

«образ»: «/media/images/x_4.jpg»,

Я хочу полный URL-адрес в поле изображения в API, когда я переопределяю метод списка.

помощь!

ответ

1

По умолчанию ModelViewSet передает запрос в ваш сериализатор, поэтому сериализатор может создавать URL-адреса на основе текущего домена. Без запроса EntrySerializer не имеют понятия о домене, поэтому он создает URL-адреса без доменов.

Вы можете это исправить несколькими способами:

  1. вместо перезаписи list метод, перезаписать get_queryset так:

    class EntryView(viewsets.ModelViewSet): 
        queryset = Entry.objects.all() 
        serializer_class = EntrySerializer 
        lookup_field = 'title' 
    
        def get_queryset(self): 
         return super(EntryView, self).filter(publish=True) 
    
  2. Используйте метод get_serializer из ModelViewSet вместо использования EntrySerializer непосредственно:

    class EntryView(viewsets.ModelViewSet): 
        queryset = Entry.objects.all() 
        serializer_class = EntrySerializer 
        lookup_field = 'title' 
    
        def list(self, request,*kwargs): 
         queryset=Entry.objects.filter(publish=True) 
         serializer = self.get_serializer(queryset,many=True) 
         return Response(serializer.data) 
    
  3. проход словарь, содержащий текущий запрос в контексте kwarg вашего сериализатором:

    class EntryView(viewsets.ModelViewSet): 
        queryset = Entry.objects.all() 
        serializer_class = EntrySerializer 
        lookup_field = 'title' 
    
        def list(self, request,*kwargs): 
         queryset=Entry.objects.filter(publish=True) 
         serializer = EntrySerializer(queryset,many=True, context={'request': request}) 
         return Response(serializer.data) 
    

Первый способ наиболее рекомендуется, последний из которых является не менее рекомендуется, поскольку существует несколько методов по умолчанию внутри ModelViewSet, которые не будут затронуты меняется внутри список способ. Кроме того, по умолчанию в сериализаторе передаются больше переменных по умолчанию.