TypeError: unhashable тип: 'list' в Django / djangorestframework - PullRequest
0 голосов
/ 19 сентября 2019

Прежде всего я знаю, что есть некоторые ответы об этой TypeError, но ни один из них не решил мою проблему.Я провел исследование, и именно поэтому я отправляю этот вопрос.

Я получил ошибку, сказав TypeError: unhashable type: 'list' в Django / djangorestframework.
Я даже не уверен, где ошибканаходится на потому, что трассировка мне не совсем понятна.

Вот мой код:
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:

Traceback (most recent call last):
  File "C:\Python36\lib\threading.py", line 916, in _bootstrap_inner
    self.run()
  File "C:\Python36\lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Python36\lib\site-packages\django\utils\autoreload.py", line 54, in wrapper
    fn(*args, **kwargs)
  File "C:\Python36\lib\site-packages\django\core\management\commands\runserver.py", line 117, in inner_run
    self.check(display_num_errors=True)
  File "C:\Python36\lib\site-packages\django\core\management\base.py", line 390, in check
    include_deployment_checks=include_deployment_checks,
  File "C:\Python36\lib\site-packages\django\core\management\base.py", line 377, in _run_checks
    return checks.run_checks(**kwargs)
  File "C:\Python36\lib\site-packages\django\core\checks\registry.py", line 72, in run_checks
    new_errors = check(app_configs=app_configs)
  File "C:\Python36\lib\site-packages\django\contrib\auth\checks.py", line 50, in check_user_model            if not cls._meta.get_field(cls.USERNAME_FIELD).unique:
  File "C:\Python36\lib\site-packages\django\db\models\options.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

Я думаю, что проблема в моем сериализаторе, но если вам нужно, чтобы я предоставил любой другой файл, пожалуйста,комментарий, и я обновлю вопрос.

1 Ответ

3 голосов
/ 19 сентября 2019

Ошибка, которую вы получаете, заключается в том, что базовый код пытается получить поле имени пользователя для модели User, но вы установили его в список вместо строки, что означает, что он не может найти указанное поле.

Изменить USERNAME_FIELD = ['email'] на USERNAME_FIELD = 'email'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...