【发布时间】:2014-10-11 08:05:44
【问题描述】:
在python manage.py syncdb的“创建超级用户”步骤中,我希望能够指定
- 电子邮件
- 密码
- 名字
- 中间名(可以留空)
- 姓氏
- 电话
我的“用户模型”是:
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 个字段都是必需的?
对于那些质疑将Account 和Person 分开的想法的人:一个Person 可以有多个与之关联的Account;这称为Person 和Account 之间的“一对多关系”;完全合法,请咨询您的律师。
我尝试将person 添加到REQUIRED_FIELDS 中,但正如documentation 中所指定的那样:
由于在 createsuperuser 提示期间无法传递模型实例,因此希望用户输入现有实例的 to_field 值(默认为 primary_key)的值。
需要一个我没有的Person ID(我需要先创建这个人)。
指定:
REQUIRED_FIELDS = ['person.name', ...]
不支持(错误提示person.name is not a field of Account)。
【问题讨论】:
-
简单的解决方案可以将 Person 设置为
null=True或提供默认值...
标签: python django django-models foreign-keys