【问题标题】:Updating User details in UserDetail Table using One-To-One Relation Django Rest API使用一对一关系 Django Rest API 更新 UserDetail 表中的用户详细信息
【发布时间】:2021-09-25 06:36:17
【问题描述】:

我是 Django 新手。 我正在尝试通过遵循 Django 文档使用一对一关系更新另一个表中的用户详细信息,但给了我一个错误。创建新用户工作正常

模型.py

class UserDetails(models.Model):
    user=models.OneToOneField(User,on_delete=models.CASCADE)
    phone=models.CharField(max_length=10)
    address=models.CharField(max_length=200,default="")
    created=models.DateTimeField(auto_now_add=True)
    updated=models.DateTimeField(auto_now_add=True)
    objects=models.Manager()
    def __str__(self):
         return self.user.username

序列化器.py

class UserDetailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserDetails
        fields= ['phone','address']
class CreateUserSerializer(serializers.ModelSerializer):
    userdetails=UserDetailsSerializer()
    class Meta:
        model = User
        fields=['id','url','username','email','password','userdetails']
    def create(self,validated_data):
        user_data=validated_data.pop('userdetails')
        user=User.objects.create_user(**validated_data)
        UserDetails.objects.create(user=user,**user_data)
        user.save()
        return user

    def update(self,instance,validated_data):
        user_data=validated_data.pop('userdetails')
        user=User.objects.update(**validated_data)
        UserDetails.objects.update(user=user,**user_data)
        user.save()
        return user

我得到的错误 - (1062, "Duplicate entry 'admin' for key 'auth_user.username'") 我知道我们可以逐列更新它,但我想一次更新所有列,因为我有很多列。我想要一个类似于create的方法。

还有一个问题是,我可以将这些创建和更新结合起来,因为它们正在做同样的事情吗?

【问题讨论】:

  • User.objects.update(**validated_data) 您正在使用该查询更新 所有 数据库中的模型...

标签: python django rest serialization django-rest-framework


【解决方案1】:

正如@Abdul Aziz Barkat 所提到的,您在update 中使用UserUserDetails 模型的方式会更新这些表上的所有行。

您需要做的是首先过滤,然后应用更改,因此类似于:

    def update(self, instance, validated_data):
        user_data = validated_data.pop('userdetails')
        instance = super().update(instance, validated_data)
        UserDetails.objects.filter(user=instance).update(**user_data)
        return instance

【讨论】:

  • 它正在更新 UserDetails 模型而不是 User 模型
  • 它成功了,谢谢。你能解释一下第三行吗?
  • 那一行是调用ModelSerializer's更新实现。这意味着父类将为您进行更新
猜你喜欢
  • 2021-09-25
  • 2019-10-14
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 2014-07-17
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多