代码之家  ›  专栏  ›  技术社区  ›  Piero Pajares

上传图片-Django Rest框架

  •  0
  • Piero Pajares  · 技术社区  · 7 年前

    我有2个用户和生态用户模型,它们的关系为1到1(对于本例,我减少了表的字段):

    class User(AbstractUser):
        picture_url = models.ImageField(upload_to='logos/', blank=True)
    
    class EcoUser(models.Model):
        user = models.OneToOneField(User, related_name='eco_user')
        document = models.CharField(max_length=45, blank=True)
    
        def __str__(self):
            return str(self.user)
    

    在其中,我使用嵌套序列化程序可以在一个表中创建和更新两个表的数据 邮递 通过这种方式,我进行了更新,因为在寄存器中我不保存图像,并且我对它没有任何问题:

    这就是 串行化器 :

    class EcoUserSerializer(serializers.ModelSerializer):
    
     user = UserSerializer(required=True)
    
     class Meta:
         model = EcoUser
         fields = '__all__'
    
     def update(self, instance, validated_data):
         instance.document = validated_data.get('document', instance.document)
         instance.save()
         user_data = validated_data.pop('user')
         user = instance.user
         user.picture_url = user_data.get('picture_url', user.picture_url)
         user.save()
         return instance
    

    在我的 视图集 :

    class EcoUserViewSet(viewsets.ModelViewSet):
        serializer_class = EcoUserSerializer
        queryset = EcoUser.objects.all()
        pagination_class = None
        parser_classes = (MultiPartParser,)
    
        @transaction.atomic
        def update(self, request, *args, **kwargs):
            with transaction.atomic():
                try:
                    instance = self.get_object()
                    instance.id = kwargs.get('pk')
                    serializer = EcoUserSerializer(instance=instance, data=request.data)
                    print(serializer)
                    if serializer.is_valid(raise_exception=True):
                        self.perform_update(serializer)
                        return Response({"status": True, "results": "Datos actualizados correctamente"},
                                        status=status.HTTP_201_CREATED)
                except ValidationError as err:
                    return Response({"status": False, "error_description": err.detail}, status=status.HTTP_400_BAD_REQUEST)
    

    在我添加 图像场 字段和它没有更新我的数据,我得到了一个400坏的请求错误。这是我寄给他的 沃伊斯 通过 阿西奥斯 :

    const bodyFormData = new FormData();
    bodyFormData.append('user.picture_url', this.params.user.picture_url.name);
    bodyFormData.append('document', this.params.document);
    this.axios.put(`/users/${this.params.id}/`, bodyFormData, { headers: { 'Content-Type': 'multipart/form-data' } })
      .then((response) => {
        this.isSending = false;
        this.$snackbar.open(response.data.results);
      });
    

    如果我在AppPend as字段名中输入 user.picture网址 ?因为它在用户对象中,所以我已经访问了图片的URL,以便能够更新它。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Piero Pajares    7 年前

    我和邮差的调查发现了这个错误:只是django表的用户名字段是必需的:

    const bodyFormData = new FormData();
    bodyFormData.append('user.picture_url', this.params.user.picture_url.name);
    bodyFormData.append('document', this.params.document);
    bodyFormData.append('user.username', this.params.username);
    

    它产生了奇迹:D

    推荐文章