我有一个 Django 应用程序,其中名为
Employee
的以下模型扮演用户 Profile
的角色,该角色与 User
模块中的 auth
相关:
class Employee(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.EmailField(unique=True)
phone = models.IntegerField(blank=True)
is_chef_de_project = models.BooleanField(
default=False
)
is_chef_de_produit = models.BooleanField(
default=False
)
is_ghr = models.BooleanField(
default=False
)
account = models.OneToOneField(
User,
on_delete=models.CASCADE,
null=True
)
我想在注册
User
时自动创建 Employee
,因此我创建了以下 signals.py
文件:
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.contrib.auth import hashers
from django.dispatch import receiver
from .models import Employee
def generate_password():
import secrets
import string
alphabet = string.ascii_letters + string.digits
return ''.join(secrets.choice(alphabet) for i in range(10))
@receiver(post_save, sender=Employee)
def create_user(sender, instance, created, **kwargs):
breakpoint()
if created:
uname = instance.first_name[0].lower() + instance.last_name.lower()
passd = generate_password()
User.objects.create(employee=instance, username=uname, password=passd)
print("generated credentials:" + uname + ":" + passd)
@receiver(post_save, sender=Employee)
def save_user(sender, instance, **kwargs):
breakpoint()
instance.account.save()
但是注册后我发现创建的
Employee
实例中的帐户属性为空:
有什么提示吗?我期望创建的
User
实例能够被注册的 Employee
引用。
有趣的是,User有属性
employee
,但在数据库中关系存储在Employee模型中。
您的情况:
@receiver(post_save, sender=Employee)
def create_user(sender, instance, created, **kwargs):
if not instance.account_id: # o2o is empty
uname = instance.first_name[0].lower() + instance.last_name.lower()
passd = generate_password()
instance.account = User.objects.create(username=uname, password=passd)
print("generated credentials:" + uname + ":" + passd)
instance.save() # recursive signal, but account_id should be not more empty
我认为,这里的逻辑有点混乱,因为你正在使用信号,而这本身就是不好的做法。但应该可以。