我正在尝试创建一个API,但是序列化程序失败了。我不知道到底出了什么问题。
意见:
elif request.method == 'POST':
data = { 'user':request.data.get('user'),'skill_item':request.data.get('new_user_skill')}
serializer = UserSkillSerializer(data=data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 序列化器:
class UserModelSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email')
extra_kwargs = {
'username': {
'validators': [UnicodeUsernameValidator()],
}
}
class UserProfileSerializer(serializers.ModelSerializer):
skill_item =SkillSerializer(read_only=True,many=True)
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email','skill_item')
extra_kwargs = {
'username': {
'validators': [UnicodeUsernameValidator()],
}
}
def create(self, validated_data):
user = UserModelSerializer.create(UserModelSerializer(),username=validated_data.get('username'))
user.save()
UserProfile.objects.create(user=user, user_skills=skill_item)
return user
class UserSkillSerializer(serializers.ModelSerializer):
user = UserProfileSerializer(required=True)
skill_item = SkillSerializer(required=True)
class Meta:
model = UserSkill
fields= '__all__'
def create (Self,validated_data):
user_data = validated_data.pop('user')
user = UserProfileSerializer.create(UserProfileSerializer(),validated_data=user_data)
skill_data = validated_data.pop('skill_item')
skill = SkillSerializer.create(SkillSerializer(),validated_data=skill_data)
user_skill, created = UserSkill.objects.update_or_create(user=user,skill_item=skill_item)
return user_skill
class SkillSerializer(serializers.ModelSerializer):
class Meta:
model = Skill
fields = '__all__'
extra_kwargs = {
'skill_name': {
'validators': [UnicodeUsernameValidator()],
}
} 模型:
# This class will more or less map to a table in the database and defines skills at the application level
class Skill (models.Model):
# this defines a required name that cannot be more than 100 characters.
skill_name = models.CharField(max_length=100,unique=True)
class Meta:
app_label = "wantedly_webapp"
# This class will more or less map to a table in the database and defines the many to many relationship between user-skill, this is our intermediate model
class UserSkill(models.Model):
""" A Model for representing skill in user profile """
unique_together = (('user', 'skill_item'),)
user = models.ForeignKey('UserProfile',on_delete=models.CASCADE,related_name='current_user_skills')
skill_item = models.ForeignKey(Skill,on_delete=models.CASCADE)
def __str__(self):
"""Return a human readable representation of the model instance."""
return "{}".format(self.skill_item.skill_name)
# this class adds a Many to Many field in existing django-rest auth UserProfile class for user and his/her skills
class UserProfile(models.Model):
user = models.OneToOneField('auth.User',unique=True,on_delete=models.CASCADE,related_name='user_profile')
user_skills = models.ManyToManyField(
Skill,
through='UserSkill',
through_fields=('user','skill_item')
)我所得到的错误基本上是由于我对视图的错误请求而发生的,该视图失败了。
serialzer.is_valid()
我不知道为什么我的UserProfileSerialzer不能正确序列化。
编辑1
我现在面临以下错误:
{
"user": {
"non_field_errors": [
"Invalid data. Expected a dictionary, but got User."
]
},
"skill_item": {
"non_field_errors": [
"Invalid data. Expected a dictionary, but got Skill."
]
}
}我认为这是因为我的序列化程序无法处理嵌套关系的外键和许多到许多关系。
编辑2-我现在面临以下错误-
File "C:\code\django\wantedly\src\wantedly_webapp\serializers\UserSkillSerializer.py", line 49, in create
user = UserProfileSerializer.create(UserProfileSerializer(),validated_data=user_data)IntegrityError at /api/v1/user/skills/唯一约束失败: auth_user.username
发布于 2018-01-20 21:30:41
我相信您的问题不是在serializer.is_valid()行上,而是在试图呈现以下错误的问题上:
return Response({serializer.errors}, status=status.HTTP_400_BAD_REQUEST)这将失败,因为serializer.errors是一个ReturnDict,您正在尝试使用{}语法生成一组。改为使用:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)https://stackoverflow.com/questions/48356344
复制相似问题