Django 中用户和配置文件之间的 OneToOne 连接
OneToOne connection between User and Profile in Django
我正在 django 中创建一个应用程序,在创建用户模型后,我通过信号创建一个配置文件:
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
@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()
但据我所知,这并不能保证我的个人资料 ID 始终等于用户的 ID
有什么聪明的方法可以更安全地做到这一点吗?
我考虑创建一个信号,在用户一号和另一号用户之后删除配置文件模型,但我仍然觉得并非所有情况都涵盖
不推荐使用built-in django 用户模型。最好创建自己的用户模型,它继承自 AbstractUser。然后覆盖保存方法:
from django.contrib.auth.models import AbstractUser
class MyUser(AbtractUser)
""" Add additional fields if you want """
def __str__(self):
return "something"
def save(self, *args, **kwargs):
Profile.objects.create(user=self)
super(MyUser, self).save(*args, **kwargs)
您还可以覆盖 delete() 和其他模型方法,请在此处阅读相关文档:https://docs.djangoproject.com/en/4.0/topics/db/models/#overriding-predefined-model-methods
当您创建以这种方式链接的单独模型时,您可以将 primary_key = True 添加到 OneToOne 字段,例如,
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
这将确保您可以为用户和配置文件使用相同的 PK 值。
我正在 django 中创建一个应用程序,在创建用户模型后,我通过信号创建一个配置文件:
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
@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()
但据我所知,这并不能保证我的个人资料 ID 始终等于用户的 ID
有什么聪明的方法可以更安全地做到这一点吗?
我考虑创建一个信号,在用户一号和另一号用户之后删除配置文件模型,但我仍然觉得并非所有情况都涵盖
不推荐使用built-in django 用户模型。最好创建自己的用户模型,它继承自 AbstractUser。然后覆盖保存方法:
from django.contrib.auth.models import AbstractUser
class MyUser(AbtractUser)
""" Add additional fields if you want """
def __str__(self):
return "something"
def save(self, *args, **kwargs):
Profile.objects.create(user=self)
super(MyUser, self).save(*args, **kwargs)
您还可以覆盖 delete() 和其他模型方法,请在此处阅读相关文档:https://docs.djangoproject.com/en/4.0/topics/db/models/#overriding-predefined-model-methods
当您创建以这种方式链接的单独模型时,您可以将 primary_key = True 添加到 OneToOne 字段,例如,
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
这将确保您可以为用户和配置文件使用相同的 PK 值。