Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django用户模型中需要名字和姓氏_Python_Django_Database_Authentication_Model - Fatal编程技术网

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)