Django передает id из одной модели во внешний ключ другой модели
У меня есть модель User и модель Employee, которая служит для дополнительной информации о пользователе, она имеет связь один к одному по полю с экземпляром User. Когда создается новый пользователь, я использую сигналы для создания нового экземпляра сотрудника. Теперь я добавил новое поле в модель User под названием 'fk_employee_id' только для того, чтобы иметь ссылку на этого вновь созданного сотрудника, и я не уверен, как передать его id в поле fk этого пользователя. Я пытался написать в своих сигналах что-то вроде instance.user.fk_employee_id = sender
после чего я получаю
ValueError Невозможно присвоить "<class 'employees.models.Employees'>": "User.fk_employee_id" должен быть экземпляром "Employees".
.
Так как же мне заполнить это поле внешнего ключа в экземпляре User при создании Employee?
Моя модель пользователя:
class User(AbstractBaseUser):
email = models.EmailField(verbose_name='email', max_length=60, unique=True)
username = models.CharField(max_length=30, unique=True, validators=[validate_username])
date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=50)
fk_employee_id = models.OneToOneField('employees.Employees', related_name='fk_employee_id',
null=True,on_delete=models.DO_NOTHING)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username', 'first_name', 'last_name']
objects = UserManager()
Модель Employee большая, в ней есть основные поля, такие как номер, адрес и т.д. Ничего особенного.
Мой файл сигналов в приложении users:
from django.db.models.signals import post_save
from .models import User
from django.dispatch import receiver
from employees.models import Employees
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Employees.objects.create(user=instance, first_name=instance.first_name,
last_name=instance.last_name)
@receiver(post_save, sender=Employees)
def save_profile(sender, instance, **kwargs):
instance.user.save()
Вам не нужно два OneToOneField
.
Достаточно одного для сотрудника.
Допустим, у вас есть:
class Employee(models.Model):
user = models.OneToOneField(User, related_name='employee_profile',on_delete=models.DO_NOTHING)
...
После миграции вы можете просто вызвать user.employee_profile
(как в атрибуте related_name
).