使用一对一关系更新 UserDetail Table 中的用户详细信息 Django Rest API
Updating User details in UserDetail Table using One-To-One Relation Django Rest API
我是 Django 的新手。
我正在尝试按照 Django 文档使用一对一关系更新另一个 table 中的用户详细信息,但给我一个错误。创建新用户工作正常
Models.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
Serializer.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'")
我知道我们可以逐列更新它,但我想一次更新所有列,因为我有很多列。我想要一个类似于创建的方法。
还有一个问题是,我可以将这些创建和更新结合起来吗,因为它们在做同样的事情?
正如@Abdul Aziz Barkat 所提到的,您在 update
中使用 User
和 UserDetails
模型的方式会更新这些表中的所有行。
您需要做的是先过滤,然后应用更改,例如:
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
我是 Django 的新手。 我正在尝试按照 Django 文档使用一对一关系更新另一个 table 中的用户详细信息,但给我一个错误。创建新用户工作正常
Models.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
Serializer.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'")
我知道我们可以逐列更新它,但我想一次更新所有列,因为我有很多列。我想要一个类似于创建的方法。
还有一个问题是,我可以将这些创建和更新结合起来吗,因为它们在做同样的事情?
正如@Abdul Aziz Barkat 所提到的,您在 update
中使用 User
和 UserDetails
模型的方式会更新这些表中的所有行。
您需要做的是先过滤,然后应用更改,例如:
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