使用一对一关系在 UserDetail Table 中保存用户详细信息 Django Rest API
Saving 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
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserDetails.objects.create(user=instance,phone="",address="")
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.userdetails.save()
Serializer.py
class UserDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = UserDetails
fields= ['phone','address']
class CreateUserSerializer(serializers.ModelSerializer):
user=UserDetailsSerializer()
class Meta:
model =User
fields=['id','url','username','email','password','user']
def create(self, validated_data):
user_data=validated_data.pop('user')
user=User.objects.create(**validated_data)
UserDetails.objects.create(user=user,**user_data)
return user
当我在 serializer.py user=UserDetailsSerializer(read_only=True)
中写上面时,否则会出现以下错误
尝试在序列化程序 CreateUserSerializer
上获取字段 user
的值时出现 AttributeError。
序列化程序字段的命名可能不正确,并且与 User
实例上的任何属性或键都不匹配。
原始异常文本为:'User' 对象没有属性 'user'.
我找到了一种让它工作的方法,但我必须手动定义每个字段,但我希望上面的序列化器工作
Working Serializer.py
class CreateUserSerializer(serializers.HyperlinkedModelSerializer):
last_login=serializers.ReadOnlyField()
date_joined=serializers.ReadOnlyField()
phone=serializers.CharField(source='userdetails.phone')
address=serializers.CharField(source='userdetails.address')
updated=serializers.ReadOnlyField(source='userdetails.updated')
# password=serializers.CharField(style={'input_type':'password'},write_only=True)
class Meta:
model = User
fields=['id','first_name','last_name','username','password','phone','address','url','email','is_superuser','is_staff','last_login','date_joined','updated']
extra_kwargs={
'password':{'write_only':True},
}
def create(self, validated_data):
userdetails_data=validated_data.pop('userdetails')
user=User.objects.create_user(**validated_data)
user.userdetails.phone=userdetails_data.get('phone')
user.userdetails.address=userdetails_data.get('address')
user.save()
return user
Edit1:根据 bdbd 在评论中的建议,我在 CreateUserSeriailzer
中用 userdetails
替换了 user
它解决了 属性错误 但是在创建用户时出错:
(1062, "密钥 'apis_userdetails.user_id' 的重复条目 '106'")
所以我替换了UserDetails.objects.create(user=user,**user_data)
user.userdetails.phone=user_data.get('phone') user.userdetails.address=user_data.get('address')
如果有人知道如何进一步减少此代码,请告诉我,因为我需要在 UserDetails Table 中创建很多列,所以我不想手动添加每个列中的每个值
Updated Serializer.py (1st One)
class CreateUserSerializer(serializers.ModelSerializer):
#user=UserDetailsSerializer()
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.userdetails.phone=user_data.get('phone')
user.userdetails.address=user_data.get('address')
user.save()
return user
试试这个:
如果您选择不使用信号:
def create(self, validated_data):
userdetails_data = validated_data.pop('userdetails')
user = User.objects.create_user(**validated_data)
UserDetails.objects.create(user=user, **userdetails_data)
return user
如果您选择使用信号:
def create(self, validated_data):
user_data = validated_data.pop('userdetails')
user = User.objects.create_user(**validated_data)
user.userdetails.phone = user_data.get('phone')
user.userdetails.address = user_data.get('address')
user.userdetails.save()
return user
我是 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
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserDetails.objects.create(user=instance,phone="",address="")
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.userdetails.save()
Serializer.py
class UserDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = UserDetails
fields= ['phone','address']
class CreateUserSerializer(serializers.ModelSerializer):
user=UserDetailsSerializer()
class Meta:
model =User
fields=['id','url','username','email','password','user']
def create(self, validated_data):
user_data=validated_data.pop('user')
user=User.objects.create(**validated_data)
UserDetails.objects.create(user=user,**user_data)
return user
当我在 serializer.py user=UserDetailsSerializer(read_only=True)
中写上面时,否则会出现以下错误
尝试在序列化程序 CreateUserSerializer
上获取字段 user
的值时出现 AttributeError。
序列化程序字段的命名可能不正确,并且与 User
实例上的任何属性或键都不匹配。
原始异常文本为:'User' 对象没有属性 'user'.
我找到了一种让它工作的方法,但我必须手动定义每个字段,但我希望上面的序列化器工作
Working Serializer.py
class CreateUserSerializer(serializers.HyperlinkedModelSerializer):
last_login=serializers.ReadOnlyField()
date_joined=serializers.ReadOnlyField()
phone=serializers.CharField(source='userdetails.phone')
address=serializers.CharField(source='userdetails.address')
updated=serializers.ReadOnlyField(source='userdetails.updated')
# password=serializers.CharField(style={'input_type':'password'},write_only=True)
class Meta:
model = User
fields=['id','first_name','last_name','username','password','phone','address','url','email','is_superuser','is_staff','last_login','date_joined','updated']
extra_kwargs={
'password':{'write_only':True},
}
def create(self, validated_data):
userdetails_data=validated_data.pop('userdetails')
user=User.objects.create_user(**validated_data)
user.userdetails.phone=userdetails_data.get('phone')
user.userdetails.address=userdetails_data.get('address')
user.save()
return user
Edit1:根据 bdbd 在评论中的建议,我在 CreateUserSeriailzer
中用 userdetails
替换了 user
它解决了 属性错误 但是在创建用户时出错:
(1062, "密钥 'apis_userdetails.user_id' 的重复条目 '106'")
所以我替换了UserDetails.objects.create(user=user,**user_data)
user.userdetails.phone=user_data.get('phone') user.userdetails.address=user_data.get('address')
如果有人知道如何进一步减少此代码,请告诉我,因为我需要在 UserDetails Table 中创建很多列,所以我不想手动添加每个列中的每个值
Updated Serializer.py (1st One)
class CreateUserSerializer(serializers.ModelSerializer):
#user=UserDetailsSerializer()
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.userdetails.phone=user_data.get('phone')
user.userdetails.address=user_data.get('address')
user.save()
return user
试试这个: 如果您选择不使用信号:
def create(self, validated_data):
userdetails_data = validated_data.pop('userdetails')
user = User.objects.create_user(**validated_data)
UserDetails.objects.create(user=user, **userdetails_data)
return user
如果您选择使用信号:
def create(self, validated_data):
user_data = validated_data.pop('userdetails')
user = User.objects.create_user(**validated_data)
user.userdetails.phone = user_data.get('phone')
user.userdetails.address = user_data.get('address')
user.userdetails.save()
return user