gpt4 book ai didi

python - 发布到 Django Rest Framework 时排除某些字段

转载 作者:太空宇宙 更新时间:2023-11-03 15:40:25 25 4
gpt4 key购买 nike

我的 DRF 中保存了以下字段。

  1. 简介
  2. 网站
  3. 电话
  4. 性别
  5. 头像

我使用react-native作为前端。在更新用户配置文件时,我只想将更改发布到服务器。但是,在发布到其余 api 时,有必要发布 formData 中的所有值,包括头像,并且由于头像没有更改,所以我尝试传递现有的服务器上的 uri 似乎不起作用。我尝试创建另一个序列化器并使用 PUT 将数据传递到服务器,但这也不起作用。我不断收到错误。

“detail”:“多部分表单解析错误 - 多部分中的边界无效:无”

我认为可能是因为传递的 uri 无效。我还尝试在序列化器中使用 get_validation_exclusions() 方法,但它也不起作用。如何在更新所有其他已更改字段的同时使头像的发布成为可选?

View .py

class ProfileView(APIView):
serializer_class = ProfileSerializer
def get(self, request, format=None):
snippets = Profile.objects.filter(pk=request.user.id)
serializer = ProfileSerializer(snippets, many=True)
return Response(serializer.data)

def post(self, request, format=None):
serializer = ProfileSerializer(data=request.data)
if serializer.is_valid():
user= User.objects.get(pk=request.user.id)
user.profile.bio=request.data["bio"]
user.profile.website=request.data["website"]
user.profile.gender=request.data["gender"]
user.profile.phoneno=request.data["phoneno"]
user.profile.avatar=request.data["avatar"]
user.profile.save()
user.save()
return Response(serializer.data,status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

def put(self, request, format=None):
snippet = User.objects.filter(pk=request.user.id)
serializer = ChangeProfileSeralizer(snippet, data=request.data)
if serializer.is_valid():
user= User.objects.get(pk=request.user.id)
user.profile.bio=request.data["bio"]
user.profile.website=request.data["website"]
user.profile.gender=request.data["gender"]
user.profile.phoneno=request.data["phoneno"]
user.profile.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

序列化器.py

class ChangeProfileSeralizer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Profile
fields = ('website', 'phoneno','gender','bio')

class ProfileSerializer(serializers.HyperlinkedModelSerializer):
avatar=serializers.ImageField(max_length=None,use_url=True)
website = serializers.CharField(required=False)
phoneno = serializers.CharField(required=False)
gender = serializers.CharField(required=False)
avatar = serializers.ImageField(required=False)

class Meta:
model = Profile
fields = ('bio','website','phoneno','gender','avatar')

def get_validation_exclusions(self,instance=None):
exclusions = super(ProfileSerializer, self).get_validation_exclusions(instance)
return exclusions +['avatar']

编辑(配置文件模型):

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE,primary_key=True)
bio = models.TextField(max_length=500, blank=True)
website = models.TextField(max_length=200, blank=True)
phoneno = models.TextField(max_length=200, blank=True)
gender = models.TextField(max_length=200, blank=True)
avatar = models.ImageField('profile picture', upload_to='images/avatar/', default='/images/avatar/blank.png')

最佳答案

如果您希望头像字段为只读,您有两个选择。

选项 1

您可以确保 ImageField 不是必需的,如 @Ruben 所说

class ProfileSerializer(serializers.HyperlinkedModelSerializer):
avatar = serializers.ImageField(required=False)

选项 2

如果该字段存储图像的字符串表示形式并且您计划在前端解析它,那么您可以简单地将头像设为 ReadOnlyField .

class ProfileSerializer(serializers.HyperlinkedModelSerializer): 
avatar = serializers.ReadOnlyField()

class Meta:
model = Profile
fields = '__all__'

关于python - 发布到 Django Rest Framework 时排除某些字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42185511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com