Python 在Django用户模型中需要名字和姓氏
在Python 在Django用户模型中需要名字和姓氏,python,django,database,authentication,model,Python,Django,Database,Authentication,Model,在django.contrib.auth.models.User中,first\u name和last\u name字段都有blank=True。如何在我自己的模型中使它们blank=False,null=False 以下是我的实现,基本上遵循以下说明: models.py signals.py 但是,我在python manage.py shell中测试时出错: >>> f = Fellow.objects.create(username='username', passwo
django.contrib.auth.models.User
中,first\u name
和last\u name
字段都有blank=True
。如何在我自己的模型中使它们blank=False,null=False
以下是我的实现,基本上遵循以下说明:
models.py
signals.py
但是,我在python manage.py shell中测试时出错:
>>> f = Fellow.objects.create(username='username', password='passwd')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/sunqingyao/Envs/django_tutorial/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/Users/sunqingyao/Envs/django_tutorial/lib/python3.6/site-packages/django/db/models/query.py", line 392, in create
obj = self.model(**kwargs)
File "/Users/sunqingyao/Envs/django_tutorial/lib/python3.6/site-packages/django/db/models/base.py", line 571, in __init__
raise TypeError("'%s' is an invalid keyword argument for this function" % list(kwargs)[0])
TypeError: 'username' is an invalid keyword argument for this function
>f=Fellow.objects.create(username='username',password='passwd')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/sunqingyao/Envs/django_tutorial/lib/python3.6/site packages/django/db/models/manager.py”,第85行,在manager_方法中
返回getattr(self.get_queryset(),name)(*args,**kwargs)
文件“/Users/sunqingyao/Envs/django_tutorial/lib/python3.6/site packages/django/db/models/query.py”,第392行,在create中
obj=自身模型(**kwargs)
文件“/Users/sunqingyao/Envs/django_tutorial/lib/python3.6/site packages/django/db/models/base.py”,第571行,在__
raise TypeError(“%s”是此函数“%list(kwargs)[0]的无效关键字参数)
TypeError:“username”是此函数的无效关键字参数
您所指的第一行文档是
有两种方法可以扩展默认用户模型而不替换您自己的模型
关键字为而不替换
我在这里看到3个选项:
1) 从派生用户类并定义所有必需字段。你可以举个例子
2) 将验证添加到UserSerializer或用户保存模型上的pre\u save
信号,并验证first\u name
和last\u name
字段。这是最简单的方法,但对于长期项目来说不是一个好的选择
3) 按照您选择的方式,将用户
模型的引用添加为用户
。定义first\u name
和last\u name
,但确保Fellow.first\u name
和Fellow.user.first\u name
之间没有重复的字段。这可能很难,因为其他开发人员可能会误解这一想法。
发生错误的原因是尚未创建用户模型,启动同伴
实例的正确方法是:
user = User.objects.create(username='test', email='test@example.com')
fellow = Fellow.objects.create(user=user, first_name='firstname', last_name='last_name')
你误解了教程。您所指的员工示例说明了如何通过OneToOneField
将原始用户
模型保持不变的方式添加到用户
,但出于所有实际目的,这就好像用户
有一个名为部门
的新字段一样。这是通过在数据库中创建两个单独的表来实现的
有一个警告,在员工
和同事
中,如果不先创建用户
实例,就不能以您尝试的方式直接创建新实例。这是因为这两个模型都不直接拥有用户名字段。所以分两步来做
user = User(username='Sun')
user.set_password('123')
user.save()
f = Fellow(user=user)
但这种方法仍然不可取。在这两种模型中都有名和姓字段。它总是会导致混乱。正确的方法是将AbstractBaseUser子类化
class Fellow(AbstractBaseUser):
first_name = models.CharField(max_length=254)
AbstractBaseUser
是一个基本用户(请参见代码:),它没有名字和姓氏,因此您可以根据需要添加它们。您应该从原始用户类派生模型。@klauds。你的意思是直接子类化User
?但是文档中的示例代码编写了类员工(models.Model):
而不是类员工(User):
…@klauds。这样做会产生一个错误:django.core.exceptions.FieldError:类“Fellow”中的本地字段“first_name”与基类“User”中同名字段冲突。
user = User(username='Sun')
user.set_password('123')
user.save()
f = Fellow(user=user)
class Fellow(AbstractBaseUser):
first_name = models.CharField(max_length=254)