如何在基础模型继承中为django中的一对一字段创建多个实例?

时间:2017-08-22 07:19:57

标签: python django

我有两种类型的用户模型继承自用户模型:

class User(AbstractBaseUser):
    user_uuid = models.UUIDField(primary_key=True)

    @property
    def is_manager(self):
        return hasattr(self, 'manager')

    @property
    def is_salesman(self):
        return hasattr(self, 'salesman')

class Manager(User):
    user = models.OneToOneField(User, parent_link=True, db_column='user_uuid')

class Salesman(User):
    user = models.OneToOneField(User, parent_link=True, db_column='user_uuid')

现在,经理也可以成为推销员。所以我想创建管理器实例和salesman实例,它们都从相同的用户实例继承。我可以这样做:

INSERT INTO t_salesman (`user_uuid`, ...) VALUES ('{manager.user.user_uuid}', ...) 

然后:

user = User.objects.get(user_uuid='{manager.user.user_uuid}')
assert user.is_manager == True
assert user.is_salesman == True

但我不能像下面那样创建推销员:

manager = Manager.objects.first()
salesman = Salesman.objects.create(user=manager.user)  # thanks @Arpit Solanki
assert salesman.user_uuid == manager.user_uuid  # AssertionError, create new user instance

有没有办法可以通过Django模型直接通过SQL直接在Salesman表中添加行?

任何建议都会有所帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

原因是用户参数是User对象而不是Manager对象。由于Manager模型具有用户属性,因此您可以将其传递给Salesman模型以创建具有相同用户的对象。请参阅下面的示例。

manager = Manager.objects.first()
salesman = Salesman.objects.create(user=manager.user)