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 值。