TypeError: unhashable type: 'list' in Django/djangorestframework



首先,我知道有一些关于这个TypeError的答案,但没有一个解决我的情况。我做了研究,这就是我发布这个问题的原因。

我在 Django/djangorestframework 中说 TypeError:unhashable type:'list' 时遇到了错误。
我什至不确定错误的位置,因为回溯对我来说不是很清楚。

这是我的代码:
serializers.py:

from rest_framework import serializers
from .models import User
class UserSerializer(serializers.ModelSerializer):
"""User model serializer"""
class Meta:
model = User
fields = ('id', 'email', 'username', 'password')
extra_kwargs = {
'password': {
'write_only': True,
'style': {'input': 'password'}
}
}
def create(self, validated_data):
"""Create and return a new user"""
user = User.objects.create_user(email=validated_data['email'], username=validated_data['username'], password=validated_data['password'])
return user

追踪:

Traceback (most recent call last):
File "C:Python36libthreading.py", line 916, in _bootstrap_inner
self.run()
File "C:Python36libthreading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "C:Python36libsite-packagesdjangoutilsautoreload.py", line 54, in wrapper
fn(*args, **kwargs)
File "C:Python36libsite-packagesdjangocoremanagementcommandsrunserver.py", line 117, in inner_run
self.check(display_num_errors=True)
File "C:Python36libsite-packagesdjangocoremanagementbase.py", line 390, in check
include_deployment_checks=include_deployment_checks,
File "C:Python36libsite-packagesdjangocoremanagementbase.py", line 377, in _run_checks
return checks.run_checks(**kwargs)
File "C:Python36libsite-packagesdjangocorechecksregistry.py", line 72, in run_checks
new_errors = check(app_configs=app_configs)
File "C:Python36libsite-packagesdjangocontribauthchecks.py", line 50, in check_user_model            if not cls._meta.get_field(cls.USERNAME_FIELD).unique:
File "C:Python36libsite-packagesdjangodbmodelsoptions.py", line 551, in get_field
return self._forward_fields_map[field_name]
TypeError: unhashable type: 'list'

models.py:

from django.db import models
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin
from django.utils import timezone

class UserManager(BaseUserManager):
"""Manager for User model"""
def create_user(self, email, username, password=None):
"""Function for creating a user"""
if not email:
return ValueError("Email must be provided")
email = self.normalize_email(email)
user = self.model(email=email, username=username)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, username, password):
"""Function for creating superusers"""
user = self.create_user(email, username, password)
user.is_staff = True
user.is_superuser = True
user.save(using=self._db)
return user

class User(AbstractBaseUser, PermissionsMixin):
"""User database model"""
email = models.EmailField(max_length=255)
username = models.CharField(max_length=50)
created_at = models.DateTimeField(default=timezone.now)
upvotes = models.IntegerField(default=0)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = ['email']
REQUIRED_FIELDS = ['username']
def __str__(self):
return self.username

我认为问题出在我的序列化程序中,但如果您需要我提供任何其他文件,请发表评论,我会更新问题。

您收到的错误是因为基础代码尝试获取 User 模型的用户名字段,但您已将其设置为列表而不是字符串,这意味着它找不到指定的字段。

USERNAME_FIELD = ['email']更改为USERNAME_FIELD = 'email'

最新更新