在 django rest 框架中创建多种类型的用户,得到了一个意想不到的关键字参数'last_login'



我正在努力学习Django,我正在创建各种案例,只是为了练习,希望能学到一些新东西。假设我试图创建不同的用户,并在后者分配不同的权限,但首先让我们尝试先创建它们。我昨晚在研究,这是一个常见的问题和许多不同的实现。我见过的最常见的是学生、老师、管理员。我的情况类似,但不是老师,而是工作人员。Staff继承自User,后者本身继承自AbstractBaseUser。下面是我为每个类、模型和序列化程序编写的代码。用户模式:

class User(AbstractBaseUser):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
email = models.EmailField(db_index=True, unique=True)
username = models.CharField(max_length=40, unique=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name','username']
objects = UserManager()
## And user manager:
class UserManager(BaseUserManager):
def get_by_natural_key(self, email):
return self.get(email=email)

型号:

class Staff(User):
qualification = models.CharField(db_index=True, max_length=255)
department = models.CharField(db_index=True, max_length=10)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name', 'department','username']
objects = StaffManager()
def __str__(self):
return self.first_name

员工模型经理:

class StaffManager(BaseUserManager):
def create_staff(self, first_name, last_name, email, qualification, department, password=None):
if email is None:
raise TypeError('Users must have an email address.')
staff = Staff(first_name=first_name, last_name=last_name,
email=self.normalize_email(email),
qualification=qualification, department=department)
staff.set_password(password)
staff.save()
return staff

员工注册序列化程序:

class StaffRegistrationSerializer(serializers.ModelSerializer):
password = serializers.CharField(
max_length=128,
min_length=8,
write_only=True
)
token = serializers.CharField(max_length=255, read_only=True)

class Meta:
model = Staff
fields = '__all__'

def create(self, validated_data):
return Staff.objects.create_staff(**validated_data)

问题是,从API中创建了一个Last login字段,但它没有在模型中声明。当我提交表格时,我会收到以下错误:

TypeError: create_staff() got an unexpected keyword argument 'last_login'
[17/Dec/2020 15:44:43] "POST /api/auth/register-staff HTTP/1.1" 500 104579

我在研究这个有类似问题的问题,但他有一个不同的实现,在这一点上,我还不完全理解,所以我可以修改我的代码以采取相同的方式。

p.S,我将按照本教程创建多种类型的用户。

问题是**validated_data具有带值的last_login。因此,当您传入validated_datakwargs时,它会扩展为create_staff()的函数参数,但last_login没有插槽。

修复方法是将, last_login=None添加到create_staff的定义中,并将其传递给新的Staff对象。例如:

def create_staff(self, first_name, last_name, email, qualification, department, password=None, last_login=None):
# code cut for brevity
staff = Staff(first_name=first_name, last_name=last_name,
email=self.normalize_email(email),
qualification=qualification, department=department,
last_login=last_login)

相关内容

最新更新