繁体   English   中英

Django Rest Framework:修补OneToOneField

[英]Django Rest Framework: Patching a OneToOneField

我需要使用Django rest框架的PATCH请求的帮助。

我有一个从AbstractBaseUser继承的User模型,该模型具有2个字段: nameemail 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM