使`createsuperuser`使用自定义/非平凡的用户模型

时间:2014-08-18 12:00:10

标签: python django django-models foreign-keys

在"创建超级用户" python manage.py syncdb的步骤,我希望能够指定

  1. 电子邮件
  2. 密码
  3. 名字
  4. 中间名(空白是可以接受的)
  5. 姓氏
  6. 电话
  7. 我的用户模型"是:

    class Account(auth_models.AbstractBaseUser):
        email       = models.EmailField(unique = True, db_index = True)
        created_on  = models.DateField(auto_now_add = True)
        person      = models.ForeignKey(Person)
        def get_full_name(self):
            ...
        def get_short_name(self):
            ...
        objects = AccountManager()
        USERNAME_FIELD = 'email'
        REQUIRED_FIELDS = []
    

    Person模型是:

    class Person(models.Model):
        name         = models.CharField(max_length = 256)
        is_staff     = models.BooleanField(default = False)
        phone        = models.CharField(max_length = 16, blank = True)
    

    我的自定义帐户"经理"自然需要拥有所有这些信息,所以我做的是:

    def create_user(self, email, password, name, phone):
        normalized_email = self.normalize_email(email)
        person = Person(
            name = name,
            phone = phone
        )
        person.save()
        account = Account(email = normalized_email, person = person)
        account.set_password(password)
        account.save()
        return account
    

    在创建过程中,它只会询问我有关电子邮件和密码的信息,同时完全忽略了需要填充的Person模型。

    如何创建它以便在"创建超级用户"中创建所有6个字段。步骤

    对于那些将AccountPerson分开的想法的人:单个Person可以有多个Account与之关联;它被称为"一对多关系"在PersonAccount之间;这完全合法,请与您的律师核实。


    我尝试将person添加到REQUIRED_FIELDS但是,正如documentation中指定的那样:

      

    由于在createsuperuser提示符期间无法传递模型实例,因此期望用户输入现有实例的to_field值(默认情况下为primary_key)。

    需要Person ID,我没有(我需要先创建此人)。

    指定:

    REQUIRED_FIELDS = ['person.name', ...]
    

    不受支持(错误说person.name不是Account的字段。)

1 个答案:

答案 0 :(得分:0)

您需要一个名为create_superuser()的方法,如下所示:

def create_superuser(self, email, password, name, phone): user = self.create_user( email=email, password=password, name = name, phone = phone ) user.save(using=self._db) return user

这种方式REQUIRED_FIELDS = ['person']对我有用。