2017-10-13 8 views
0

UserモデルにはForeignKeyフィールドがあります。Djangoはオプションの関連フィールドやget_or_createを使うべきですか?

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

すべてのユーザーには会社が必要です。

問題はcreate_super_user方法は、プロジェクトの開始時にcompanyを持っていないと私は次のエラーを取得:だから、それは単にデフォルトCompanyを作成し、それを割り当てることが最善だろう

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

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が作成されます。

一方、null=Truecompanyフィールドをオプションにすることはできますが、各ユーザーが会社に関連付けられているシステムルールが破られるようになりました。

他にどのようにして企業が既に作成されていることを保証できますか?

答えて

1

あなたは、会社のモデルにBooleanFieldを追加することができます:あなたは、この分野で会社を検索することができcreate_superuserで今

is_default = BooleanField(default=False) 

defaults引数get_or_createを使用して、デフォルトの会社が存在しない場合に新しい会社名を設定することができます。

company, created = Company.objects.get_or_create(
    is_default=True, 
    defaults={'name': 'Default Company'} 
) 
関連する問題