2017-12-07 10 views
0

私は2つのモデルのアカウントとユーザーがあります。アカウントは複数のユーザーを持つことができます。Djangoフォーム保存 - 循環依存

最初のユーザー(所有者)が同時に作成されると、アカウントが作成されます。

ユーザーには、アカウントに外部キーがあるので、まずアカウントを作成し、ユーザーの後にする必要があります。

アカウントには、request.userというフィールドcreated_byがあります。円形の問題もそうです。

アカウントとcreated_byを作成してスーパーユーザー(最初)にし、ユーザーを作成し、新しいユーザーでアカウントを更新する必要があると思います。

class Account(MetaData): 
    name = models.CharField(max_length=255) 
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, 
            related_name='%(app_label)s_%(class)s_created_by', on_delete=models.CASCADE) 

class User(AbstractBaseUser): 
    account = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, related_name='owner') 

どうすればいいですか?

最初のユーザーには初めてこれが必要です。これは、他のユーザーに対してはアカウントが存在するためです。

私は最初のユーザーと言っていますが、私はスタッフのユーザー(スーパーユーザー)ではなく、アカウントを必須とする通常のユーザーを登録フォームといいます。

blank=Trueは、スタッフ専用です。

+1

だけ上記のコードでは、 'AUTH_USER_MODEL'が' User'であると仮定すると 'User'モデルの' account'フィールドは 'User'(' Account'ではなく)を指しています。 – dirkgroten

答えて

2

あなたUserモデルのaccountフィールドはnullを許可するので、何もまず、このユーザーのアカウントを作成し、アカウントを持たないユーザを作成し、最後にアカウントを持つユーザーを更新できないようにしない:

with transaction.atomic(): 
    user = User.objects.create(account=None, ...) 
    account = Account.objects.create("test", created_by=user) 
    user.account = account 
    user.save(update_fields=["account"]) 
0

最初のユーザーにのみ問題があるため、アカウントを追加するにはoverride the method create_superuser of the managerとします。また、ForeignKeynull=Trueと定義しているので、最初にスーパーユーザ(super().create_superuser()を使用)を作成してからaccountを作成し、それをスーパーユーザーに割り当てるのは問題ではありません。

初めてサイトを展開するときは、手動で./manage.py createsuperuserコマンドを実行する必要があります。

+0

私は最初のユーザーを言っていますが、私はスタッフのユーザー(スーパーユーザー)を指すのではなく、アカウントが必須の通常のユーザー – user3541631

+0

ああ、それははっきりしていませんでした。次に、もう一つの答えは問題に適合します。 – dirkgroten