我正在尝试更新UserDetailsserializer,问题是当我在测试模型中运行代码时,它可以正常工作,但是当我在实际应用中使用它时,它会引发此错误:'用户'对象没有属性"用户fofile"
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
serializer.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)
错误:
相关的objectDoesnotexist at/rest-auth/user/
用户没有用户。
这是因为尚未创建用于用户的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')
是否存在用户程序实例,如果不是,则为该用户创建一个默认的实例。
参考:这是一个很酷的主题扩展用户模型
创建用户配置文件时,请确保保存它们,可以参考此片段。
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
。