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).

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