Django应该使用可选的相关字段还是get_or_create?

时间:2017-10-13 09:41:06

标签: django models

我在ForeignKey模型上有一个User字段。

company = models.ForeignKey('crm.Company')

所以每个用户都需要有一家公司。

问题是create_super_user方法在项目开始时没有company,我收到以下错误:

django.db.utils.OperationalError: (1054, "Unknown column 'users_user.company_id' in 'field list'")

因此,最好只创建默认Company并将其与get_or_create分配如下:

def create_superuser(self, email, password, **kwargs):
    company, created = Company.objects.get_or_create(
        name='Default Company',
    )
    kwargs.setdefault('company', company)
    kwargs.setdefault('is_staff', True)
    kwargs.setdefault('is_superuser', True)
    kwargs.setdefault('is_active', True)

    if kwargs.get('is_staff') is not True:
        raise ValueError('Superuser must have staff=True')
    if kwargs.get('is_superuser') is not True:
        raise ValueError('Superuser must have is_superuser=True')
    return self.create_user(email, password, **kwargs)

当我从命令行创建新的超级用户并且Default company已更改时,可能会出现此问题。现在将创建一个新的Default Company

另一方面,我可以使用company使null=True字段可选,但现在会破坏每个用户与公司关联的系统规则。

我怎样才能确保公司已经创建?

1 个答案:

答案 0 :(得分:1)

您可以将BooleanField添加到公司模型中:

is_default = BooleanField(default=False)

现在在create_superuser,您可以按此字段搜索公司。如果默认公司不存在,您可以使用defaults get_or_create参数设置新的公司名称:

company, created = Company.objects.get_or_create(
    is_default=True, 
    defaults={'name': 'Default Company'}
)