[英]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.