Соединение 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 для пользователя и профиля.