Данные слишком длинные для столбца при создании пользователя - PullRequest
0 голосов
/ 30 мая 2020

Перейдя к

url(r'api/users/', views.MyUserCreate.as_view(), name='user-create'),

, можно увидеть DRF Browsable API

DRF Create Custom User Browsable API View

, который использует MyUserCreate (в views.py )

class MyUserCreate(APIView):
    """ 
    Creates the user. 
    """

    def post(self, request, format='json'):
        serializer = MyUserSerializer(data=request.data)
        if serializer.is_valid():
            MyUser.objects.create_user(
                        serializer.username,
                        serializer.password
            )
            if user:
                return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)

Обратите внимание, что он ссылается на MyUserSerializer (в serializers.py)

class MyUserSerializer(serializers.ModelSerializer):
    username = serializers.CharField(
            required=True,
            validators=[UniqueValidator(queryset=MyUser.objects.all())],
            min_length=5,
            max_length=20
            ),
    password = make_password(serializers.CharField(
            write_only=True,
            required=True,
            max_length=256
            ))

    class Meta:
        model = MyUser
        fields = ('username', 'password')

    def create_user(self, validated_data):
        password = make_password(validated_data['password'])
        user = MyUser.objects.create_user(validated_data['username'], password)
        return user

и MyUser (в models.py)

class MyUserManager(BaseUserManager):
    def create_user(self, username, password):
        user = self.model(
            username=username
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

class MyUser(AbstractBaseUser):
    objects = MyUserManager()
    class Meta:
        # managed = False
        db_table = 'user_entity'

    user_id = models.AutoField(primary_key=True, db_column='userId')
    username = models.CharField(db_column='username', unique=True, max_length=20)
    password = models.CharField(db_column='userPassword', max_length=256)

    USERNAME_FIELD = 'username'

    def __str__(self):
        return str(self.user_id) + " (%s)" % str(self.username)

Когда я публикую для создания пользователя

{
    "username": "tiagoperes",
    "password": "test"
}

я получаю

django .db.utils.DataError: (1406, «Данные слишком длинные для столбца« имя пользователя »в строке 1» )

Django error Data too long for column 'username' at row 1

Следуя информации от других пользователей, проверял, соответствует ли столбец UTF8

UTF8 column

и не имеет смысла использовать здесь TextField вместо CharField.

1 Ответ

1 голос
/ 30 мая 2020
  1. Вы передаете serializer.username для создания функции, которая не является данными, которые вы передали через запрос POST, отсюда и ошибка.
  2. Измените свой метод create_user(...), на create(...) в MyUserSerializer, чтобы DRF обрабатывал функцию, когда вы вызываете метод .save() из Посмотреть. (что является способом DRF)

Измените ваше представление как

class MyUserCreate(APIView):

    def post(self, request, format='json'):
        serializer = MyUserSerializer(data=request.data)
        <b>if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)</b>
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

, а также ваш сериализатор

class MyUserSerializer(serializers.ModelSerializer):
    # rest of your code

    def <b>create</b>(self, validated_data):
        password = make_password(validated_data['password'])
        user = MyUser.objects.create_user(validated_data['username'], password)
        return user
...