2017-10-13 71 views
0

我在User模型上有一個ForeignKey字段。Django應該使用可選的相關字段還是get_or_create?

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

您可以添加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'} 
) 
相關問題