2017-12-07 2 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' 필드는'Account'가 아닌'User'를 가리키고 있습니다. – 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

아 ok, 그건 분명하지 않았습니다. 그런 다음 다른 대답이 문제를 해결합니다. – dirkgroten