2015-02-22 4 views
1

Так у меня есть этот класс:Как добавить дополнительные данные перед проверкой/сохранением сериализатора в DRF?

class MyClass(models.Model):  
    name = models.CharField(max_length=100)  
    created_time = models.DateTimeField(auto_now_add = True) 
    modified_time = models.DateTimeField(auto_now = True) 

, а затем другой класс, представляющий соответствующие фотографии MyClass:

class MyPhoto(models.Model): 
    myclass = models.ForeignKey(MyClass, unique=False, related_name='photos') 
    photo = models.ImageField(upload_to='photos',blank=False) 

Я хотел бы создать конечную точку, которая будет обрабатывать загруженные фотографии (тип контента будет многочастному и идентификатор associted MyClass будут переданы в URL), так это то, что у меня есть:

urls.py:

router = routers.DefaultRouter()  
router.register(r'photos/(?P<myclass_id>\d+)',PhotoViewSet) 

Viewset:

class PhotoViewSet(CreateModelMixin, 
        viewsets.GenericViewSet): 
    queryset = MyPhoto.objects.all() 
    serializer_class = serializers.PhotoAlterSerializer 
    parser_classes = (parsers.MultiPartParser,) 

    def create(self, request, *args,**kwargs): 
     myclass = MyClass.objects.get(pk=kwargs['myclass_id']) 
     serializer = serializers.PhotoAlterSerializer(data=request.data,context={'request': request}) 
     if serializer.is_valid(raise_exception=True): 
      photo=serializer.save(myclass=myclass) 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

и сериализатору:

class PhotoAlterSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = MyPhoto 
     fields = ('myclass','photo') 

, как вы можете увидеть Im добавление дополнительного MyClass атрибута к serializer.save метода (MyClass = MyClass).

Однако, если я загружаю фотографию и правильно передаю идентификатор myclass в url, я получаю Это поле обязательно для заполнения. ошибка. Если я добавлю правильную гиперссылку на myclass в загруженную многочастную форму с фотографией, запрос пройдет проверку, а затем myclass из формы будет заменен классом myclass, который я получил из идентификатора URL.

Как я могу сделать эту работу, поэтому, если я разместил только фотографию на url http://blabla/api/photos/2, экземпляр этой фотографии и myclass с pk = 2 будет сохранен в db?

ответ

1

Это потому, что вы указали myclass в полях meta вашего сериализатора. Это делает DRF необходимым и проверяет его как часть данных POST. Любое поле, которое вы установили бы сами, не должно быть частью полей сериализатора. Итак, все, что вам нужно сделать, это удалить myclass от Meta.fields.

class PhotoAlterSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = MyPhoto 
     fields = ('photo',) 
+0

Да, вы правы, спасибо вам большое! :) –

Смежные вопросы