Django根据条件更改模型关系(是否为人员)

时间:2018-11-22 20:21:38

标签: django django-models

我有2个痣,用户和帐户。用户可以是职员或普通用户。 通常,一个用户只能拥有一个帐户。

这就是我现在拥有的:

class User(AbstractBaseUser):
    account = models.OneToOneField(Account, null=True, on_delete=models.CASCADE)

但是在特殊情况下,只有用户为is_staff,用户才能拥有多个或没有帐户。

现在的逻辑是拥有一个ForeignKey:

class User(AbstractBaseUser):
        account = models.ForeignKey(Account, on_delete=models.CASCADE)

但是在这种情况下,如何在Django Admin中停止运行,否则,如果一个用户不是员工,那么该用户将拥有多个外键,并强制普通用户具有模拟的OneToOne关系。

1 个答案:

答案 0 :(得分:0)

如果您想建立一个职员用户可以拥有多个帐户的Many-to-one关系,则该帐户模型应包含外键。另外,您可以override使用类似于以下代码的帐户的保存模型来增强条件:

class Account(...):
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def save(self, *args, **kwargs):
        user = self.user
        if user and user.set_account.count() > 0 and not user.is_staff:
            raise ValidationError(_('You cannot add another account to user {}'.format(user.username)))
        super(Account, self).save(*args, **kwargs)