如何将模型转换为其父模型?

时间:2019-08-27 16:01:08

标签: django django-models

我创建了一个类,当您保存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的自动生成”,但是出于安全原因,我想要始终将PersonUser关联。有没有办法做类似的事情:

user = User.objects.create(username='test',)
w = Worker(user.person)
w.job = "the job"
w.save()

(我知道先前的代码不起作用),还是有办法将Person“投射”到Worker

1 个答案:

答案 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_creationdate_last_modif应该自动生成:它们在各自的声明中分别具有auto_now_add=Trueauto_now=True

但是通过使用save_base(raw=True),您必须手工创建它们。 无论如何,这都行得通,而且有点hacker,我希望Django在不久的将来能够有一个模型,可以轻松地与其父模型“投射”或“链接”。