繁体   English   中英

Django 将 id 从一个 model 传递给另一个外键

[英]Django pass id from one model to another's foreign key

我有一个 User model 和 Employee model,它们代表有关用户的附加信息,它与 User 实例具有一对一的字段关系。 创建新用户时,我使用信号创建新的 Employee 实例。 现在我向用户 model 添加了名为“fk_employee_id”的新字段,只是为了链接到这个新创建的员工,我不确定如何将它的 ID 传递给这个用户的 fk 字段。 我试着在我的信号中写一些类似instance.user.fk_employee_id = sender的东西,然后我得到

ValueError 无法分配“<class 'employees.models.Employees'>”:“User.fk_employee_id”必须是“Employees”实例。

那么如何在创建 Employee 时在 User 实例中填充这个外键字段呢?

我的用户 model:

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 model 很大,它有一些基本字段,如号码、地址等。没什么特别的。

我在用户应用程序中的信号文件:

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

您不需要 2 个OneToOneField 一个给员工就足够了。

假设您有:

class Employee(models.Model):
    user = models.OneToOneField(User, related_name='employee_profile',on_delete=models.DO_NOTHING)
    ...

迁移后,您只需调用user.employee_profile (就像在related_name属性中一样)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM