我创建了一个类,当您保存User
时,会自动创建与Person
关联的User
,如下所示:
class Person(models.Model):
user = models.OneToOneField(User, blank=False, null=False,
on_delete=models.CASCADE)
@receiver(post_save, sender=User)
def my_post_save_user_handler(sender, instance, created, **kwargs):
if created: # a User = physical -> create the associated person:
Person.objects.create(user=instance, is_physical=True)
后来我做了一个Worker
:
class Worker(Person):
job = models.CharField(unique=True, max_length=200)
我的问题是我想创建一个与User
(=不是Worker
)关联的Person
。
当我这样做时:
user = User.objects.create(username='test',)
Worker.objects.create(user=user)
我收到此错误:
django.db.utils.IntegrityError: duplicate key value violates unique constraint "app_person_user_id_key"
DETAIL: Key (user_id)=(2230) already exists.
这是正常现象,因为在创建post_save
时触发User
,然后在创建Worker
时再次触发。
您可能会回答“只是删除Person
的自动生成”,但是出于安全原因,我想要始终将Person
与User
关联。有没有办法做类似的事情:
user = User.objects.create(username='test',)
w = Worker(user.person)
w.job = "the job"
w.save()
(我知道先前的代码不起作用),还是有办法将Person
“投射”到Worker
?
答案 0 :(得分:0)
这是解决方案:
p = Worker(person_ptr=user.person,
date_creation=datetime.date.today(),
date_last_modif=datetime.date.today(),
job=job or _("(not precised)"))
p.save_base(raw=True)
请注意,date_creation
和date_last_modif
应该自动生成:它们在各自的声明中分别具有auto_now_add=True
和auto_now=True
。
但是通过使用save_base(raw=True)
,您必须手工创建它们。
无论如何,这都行得通,而且有点hacker,我希望Django在不久的将来能够有一个模型,可以轻松地与其父模型“投射”或“链接”。