Django表单保存 - 循环依赖

时间:2017-12-07 11:52:23

标签: django django-models django-forms

我有2个帐户和用户模型。一个帐户可以有多个用户。

同时创建第一个用户(所有者)时,将创建帐户。

因为用户有一个ForeignKey帐户,我需要先创建帐户,然后再创建用户。

但是Account有一个created_by字段,它是request.user。这是一个循环问题。

我认为我需要首先创建帐户并创建为超级用户(第一个),然后创建用户,并使用新用户更新帐户。

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仅适用于工作人员。

2 个答案:

答案 0 :(得分:2)

您的User模型的account字段允许空值,因此没有任何内容可以阻止您首先创建没有帐户的用户,然后使用此用户创建帐户,最后使用该帐户更新用户:< / p>

 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"])

答案 1 :(得分:0)

由于第一个用户只是一个问题,您可能希望override the method create_superuser of the manager添加该帐户。此外,由于您已使用public static void main(String[] args) { boolean run = true; Scanner scanner = new Scanner(System.in); // Init before loops String userInput = ""; // tmp var that holds input while (run) { // do something System.out.println("Another action? [Y/N]"); userInput = scanner.next(); // Read first time // Run while user does not put Y || y || N || n while (!userInput.matches("[YyNn]")){ System.out.println("Incorrect input"); userInput = scanner.next(); } // User does not want more actions if(userInput.matches("[Nn]")){ System.out.println("Do you wish to exit the program? [Y/Any other key]"); String choice = scanner.next(); // Stop the program if (choice.toLowerCase().equals("y")) run = false; } } scanner.close(); // Close scanner outside } 定义了ForeignKey,因此首先创建超级用户(使用null=True)然后创建super().create_superuser()应该不会有问题并将其附加到超级用户。

首次部署网站时,您必须手动运行account命令。