【发布时间】:2017-05-19 16:41:57
【问题描述】:
我正在使用'User profile' 方法来扩展我的用户模型,如下所示:
# models.py
class UserProfile(models.Model):
user = models.OneToOneField(User, related_name='profile', on_delete=models.CASCADE, primary_key=True)
my_field = models.CharField(max_length=100)
# signals.py
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
使用这种方法,我必须显式调用user.profile.save(),这对我来说感觉很笨拙,因为我希望profile 给人一种错觉,它是User 对象的一部分:
# views.py
def some_func(request):
user = User.objects.create_user('dummy', 'dummy@dummy.com', '12345678')
user.profile.my_field = 'hello'
user.save() # This does not persist the profile object...
user.profile.save() # ...this does
为了解决这个问题,我将create_user_profile() 更改为以下内容,这样可以:
# signals.py
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
profile = UserProfile.objects.get_or_create(user=instance)
profile.save()
我遇到的许多示例都没有使用这种方法。使用这种方法有什么注意事项吗?
【问题讨论】:
标签: django django-models django-signals