/rest-auth/user/ 处的 RelatedObjectDoesNotExist:用户没有用户配置文件
RelatedObjectDoesNotExist at /rest-auth/user/: User has no userprofile
我正在尝试更新 UserDetailsSerializer,问题是当我 运行 我的代码在我的测试模型中工作时,但当我在我的实际应用程序中使用它时,它抛出这个错误:'User'对象没有属性 'userprofile'
model.py
class userProfileModel(models.Model):
GENDER = [
('', ""),
('M', "Male"),
('F', "Female")
]
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='userprofile', default='')
avatar = models.ImageField(upload_to='avatar/', default='avatar/no-avatar.png')
age = models.DateField(auto_now_add=True)
gender = models.CharField(max_length=10, choices=GENDER, default='')
address = models.CharField(max_length=500, default='')
longitude = models.FloatField(default=0.0)
latitude = models.FloatField(default=0.0)
phone = models.IntegerField(default=0)
user_is_active = models.BooleanField(default=False)
def __str__(self):
return self.user.username
serializers.py
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = userProfileModel
fields = (
'id',
'avatar',
'age',
'gender',
'address',
'longitude',
'latitude',
'phone',
)
class UserDetailsSerializer(UserDetailsSerializer):
profile = UserProfileSerializer(source='userprofile')
class Meta(UserDetailsSerializer.Meta):
fields = UserDetailsSerializer.Meta.fields + ('profile',)
read_only_fields = ('',)
def update(self, instance, validated_data):
# User data
nested_serializer = self.fields['profile']
nested_instance = instance.userprofile
nested_data = validated_data.pop('userprofile')
nested_serializer.update(nested_instance, nested_data)
return super(UserDetailsSerializer, self).update(instance, validated_data)
错误:
RelatedObjectDoesNotExist at /rest-auth/user/
User has no userprofile.
这是因为 UserProfile
用户的实例尚未创建。您可以在 User
模型的 post_save
上使用信号,这样每当保存用户时,检查是否为其创建了 UserProfile
实例,如果没有则创建一个。如下所示:
def create_profile(sender,**kwargs ):
if kwargs['created']:
user_profile=UserProfile.objects.create(user=kwargs['instance'])
post_save.connect(create_profile,sender=User)
也像我的朋友在评论中建议的那样,始终检查 hasattr(instance, 'profile')
是否存在 userProfile 实例,如果不存在,则为该用户创建一个默认实例。
参考:这个话题很酷Extending user model
创建用户个人资料时,请确保保存它们,您可以参考此代码段。
class Profile(models.Model):
# ...
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
并且不要忘记导入 post_save
。
我正在尝试更新 UserDetailsSerializer,问题是当我 运行 我的代码在我的测试模型中工作时,但当我在我的实际应用程序中使用它时,它抛出这个错误:'User'对象没有属性 'userprofile'
model.py
class userProfileModel(models.Model):
GENDER = [
('', ""),
('M', "Male"),
('F', "Female")
]
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='userprofile', default='')
avatar = models.ImageField(upload_to='avatar/', default='avatar/no-avatar.png')
age = models.DateField(auto_now_add=True)
gender = models.CharField(max_length=10, choices=GENDER, default='')
address = models.CharField(max_length=500, default='')
longitude = models.FloatField(default=0.0)
latitude = models.FloatField(default=0.0)
phone = models.IntegerField(default=0)
user_is_active = models.BooleanField(default=False)
def __str__(self):
return self.user.username
serializers.py
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = userProfileModel
fields = (
'id',
'avatar',
'age',
'gender',
'address',
'longitude',
'latitude',
'phone',
)
class UserDetailsSerializer(UserDetailsSerializer):
profile = UserProfileSerializer(source='userprofile')
class Meta(UserDetailsSerializer.Meta):
fields = UserDetailsSerializer.Meta.fields + ('profile',)
read_only_fields = ('',)
def update(self, instance, validated_data):
# User data
nested_serializer = self.fields['profile']
nested_instance = instance.userprofile
nested_data = validated_data.pop('userprofile')
nested_serializer.update(nested_instance, nested_data)
return super(UserDetailsSerializer, self).update(instance, validated_data)
错误:
RelatedObjectDoesNotExist at /rest-auth/user/
User has no userprofile.
这是因为 UserProfile
用户的实例尚未创建。您可以在 User
模型的 post_save
上使用信号,这样每当保存用户时,检查是否为其创建了 UserProfile
实例,如果没有则创建一个。如下所示:
def create_profile(sender,**kwargs ):
if kwargs['created']:
user_profile=UserProfile.objects.create(user=kwargs['instance'])
post_save.connect(create_profile,sender=User)
也像我的朋友在评论中建议的那样,始终检查 hasattr(instance, 'profile')
是否存在 userProfile 实例,如果不存在,则为该用户创建一个默认实例。
参考:这个话题很酷Extending user model
创建用户个人资料时,请确保保存它们,您可以参考此代码段。
class Profile(models.Model):
# ...
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
并且不要忘记导入 post_save
。