Соединение OneToOne между пользователем и профилем в 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()

Но насколько я чувствую, это не гарантирует мне, что идентификатор профиля всегда равен идентификатору пользователя

Есть ли какой-нибудь разумный способ сделать это более безопасно?

Я думаю о создании сигнала, который будет удалять модель профиля после пользователя один и напротив, но я все еще чувствую, что не все случаи охвачены

Не рекомендуется использовать встроенную модель django User. Лучше создать свою собственную модель User, которая наследуется от 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 для пользователя и профиля.

Вернуться на верх