[英]Django Rest Framework OneToOneField related BooleanFilter
[英]Django Rest Framework: Patching a OneToOneField
我需要使用Django rest框架的PATCH请求的帮助。
我有一个从AbstractBaseUser
继承的User
模型,该模型具有2个字段: name
和email
。 email
字段是唯一的。
然后,我有一个DojoMaster
模型,该模型与User
模型具有OneToOne关系:
models.py
class DojoMaster(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
phone = models.BigIntegerField()
username = models.CharField(max_length=100, unique=True)
country = models.ForeignKey(Country, on_delete=models.CASCADE)
我可以将“ dojomaster”发布到应用程序。 假设“ dojomaster” POST如下所示:
POST payload
{
"user": {
"name": "XYZ",
"email": "xyz@mail.com",
"password": "2He$8Mv*"
},
"phone": 2685211,
"country": 575,
"username": "iAmXyZ"
}
现在,“ dojomaster”想要更改其中一些细节,因此发送了PATCH请求:
PATCH payload
{
"user": {
"name": "XYZ",
"email": "xyz24@mail.com", #change email
"password": "p@55w0rd" #change password
},
"phone": 3972925, #change phone number
"country": 575,
"username": "iAmXyZ"
}
为此,我在serializers.py
创建了以下代码:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('name', 'email', 'password')
class DojoMasterUpdateSerializer(serializers.ModelSerializer):
user = UserSerializer(required=True)
def update(self, instance, validated_data):
user_data = validated_data.pop('user')
user = User.objects.update(**user_data)
instance.user = validated_data.get('user', user)
instance.username = validated_data.get('username', instance.username)
instance.phone = validated_data.get('phone', instance.phone)
instance.country = Country.objects.get(
country=validated_data.get('country', instance.country)
)
instance.save()
return instance
class Meta:
model = DojoMaster
fields = ('user', 'country', 'phone', 'username')
write_only_fields = ('password',)
要使用序列化程序,我创建了以下视图:
views.py
class DojoMasterUpdateView(generics.UpdateAPIView):
queryset = DojoMaster.objects.all()
serializer_class = DojoMasterUpdateSerializer
但是,执行此操作时,出现以下负载: Status: 400 Bad Request
错误:
{
"user": {
"email": [
"user with this email already exists."
]
}
}
我还尝试过使用PUT请求来完成操作。
如何使用DRF修补具有这种OneToOneField关系类型的实体? 您的帮助将不胜感激。
这个问题很旧,您可能已经找到答案了。
但是,如果有人想知道:
问题是这样的:
user = User.objects.update(**user_data)
这样,您就不会更新用户的一个实例-您正在尝试使用user_data更新User表中的所有用户。
由于您正在修补DojoMaster实例,因此您应该已经拥有属于它的user实例:
因此,您的更新方法可能看起来像这样:
def update(self, instance, validated_data):
user_data = validated_data.pop('user')
user_ser = UserSerializer(instance=instance.user, data=user_data)
if user_ser.is_valid():
user_ser.save()
instance.username = validated_data.get('username', instance.username)
instance.phone = validated_data.get('phone', instance.phone)
instance.save()
return instance
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.