Я создаю API как часть проекта для университета, однако я застрял, когда решал, как обновлять мою пользовательскую модель. В настоящее время у меня есть сериализатор для обновления профиля, но когда я пытаюсь обновить таблицу с помощью сериализатора, он падает с ошибкой 1406: «Данные слишком длинные для столбца« title »в строке 1». Я не уверен, как решить эту проблему в настоящее время, и мне было интересно, если кто-то может указать мне правильное направление
Обновление:
Таким образом, кажется, что я получал данные слишком долго для ошибок столбцов, потому что код, который я имею, добавляет к столбцам вместо того, чтобы просто либо изменять их, если JSON содержит данные для поля, либо оставлять их, если это не так. Поэтому, как только я возился с длинами столбцов, я получил следующую строку базы данных:
(Нет, «Энтони»), (Нет, (Нет, «Энтони»)), 1, 0, 1, 1, 2019-01-01, («a
тестовый адрес ',' привет '), (Нет, Нет), (Нет, Нет), edd, (Нет,
«мальчик»), (нет, «там»), (нет, нет), (нет, «282»)
рассматриваемая модель:
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email address'), unique=True)
title =models.CharField(_('Title'), max_length=8, null=True, blank=True)
first_name=models.CharField(_('first name(s)'), max_length=100, blank =True)
last_name=models.CharField(_('last name'), max_length=100, blank = True)
is_active=models.BooleanField(_('account active'), default=False)
is_driver = models.BooleanField(_('driver status'), default=False)
is_staff = models.BooleanField(_('staff status'), default =False)
is_admin = models.BooleanField(_('admin status'), default =False)
dob = models.DateField(auto_now_add= True, blank=True)
address_1=models.CharField(_('address line 1'),max_length=60, null=False, blank=False)
address_2=models.CharField(_('address line 2'),max_length=60, null=True, blank=True)
address_3=models.CharField(_('address line 3'),max_length=60, null=True, blank=True)
city = models.CharField(_('city'),max_length=60, null=False, blank=False)
county = models.CharField(_('county'),max_length=60, null=False, blank=False)
postcode = models.CharField(_('postcode'),max_length=8, blank=False, null=False)
phone_no = models.CharField(_('phone number'),max_length=50, null=True, blank=True)
mobile_no = models.CharField(_('mobile Number'),max_length=50,null=False, blank=False)
drivers_licence_number = models.CharField(max_length=30, null=True, blank=True)
taxi_licence_number=models.CharField(max_length=30, null=True, blank=True)
driver_photo=models.ImageField(blank=True)
date_joined=models.DateField(auto_now_add=True, blank=True)
last_update=models.DateField(auto_now_add=True, blank=True)
рассматриваемый сериализатор:
class UserProfileSerializer (serializers.ModelSerializer):
model = User
id = serializers.IntegerField(read_only=True)
dob = serializers.DateField(read_only=True)
title=serializers.CharField(max_length=8, required=False)
first_name=serializers.CharField(max_length=80,required=False)
last_name=serializers.CharField(max_length=80,required=False)
address_1 = serializers.CharField(max_length=100, required=False)
address_2 = serializers.CharField(max_length=100,required=False)
address_3 = serializers.CharField(max_length=100,required=False)
postcode = serializers.CharField(max_length=10, required=False)
county = serializers.CharField(max_length=50, required=False)
city = serializers.CharField(max_length=50, required=False)
phone_no = serializers.CharField(required=False)
mobile_no = serializers.CharField(required=False)
def update (self, instance, validated_data):
instance.title= validated_data.get('title'), instance.title
instance.first_name = validated_data.get('first_name'), instance.first_name
instance.last_name = validated_data.get('last_name'), instance.first_name
instance.address_1 = validated_data.get('address_1'), instance.address_1
instance.address_2 = validated_data.get('address_2'), instance.address_2
instance.address_3 = validated_data.get('address_3'), instance.address_3
instance.postcode = validated_data.get('postcode'), instance.postcode
instance.county = validated_data.get('county'), instance.county
instance.phone_no = validated_data.get('phone_no'),instance.phone_no
instance.mobile_no = validated_data.get('mobile_no'), instance.mobile_no
instance.last_update = datetime.now()
instance.save()
return instance
Посмотреть в вопросе:
class UpdateProfile(APIView):
permission_classes=[permissions.IsAuthenticated]
def post(self, request, format=None):
user=request.user
print (user.id)
query_set=User.objects.get(id=user.id)
print("we got a queryset")
print(query_set)
serializer=UserProfileSerializer(query_set, data=request.data)
if serializer.is_valid():
profile = serializer.save()
if profile:
return Response(user.data, status=status.HTTP_200_OK)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Трассировка с консоли сервера:
Внутренняя ошибка сервера: / editprofile / Traceback (самый последний вызов
последний): файл
"C: \ Users \ Клини \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ Lib \ сайта-пакеты \ Джанго \ DB \ движки \ utils.py",
строка 85, в _execute
return self.cursor.execute (sql, params) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ db \ backends \ mysql \ base.py" ,
строка 71, в исполнении
return self.cursor.execute (query, args) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ MySQLdb \ cursors.py",
строка 250, в исполнении
self.errorhandler (self, exc, value) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ MySQLdb \ connections.py",
строка 50, в defaulterrorhandler
поднять значение ошибки в файле "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ MySQLdb \ cursors.py",
строка 247, в исполнении
res = self._query (запрос) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ MySQLdb \ cursors.py",
строка 412, в _query
rowcount = self._do_query (q) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ MySQLdb \ cursors.py",
строка 375, в _do_query
db.query (q) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ MySQLdb \ connections.py",
строка 276, в запросе
_mysql.connection.query (self, query)
_mysql_exceptions.DataError: (1406, «Данные слишком длинные для столбца« заголовок »в строке 1»)
Вышеуказанное исключение было прямой причиной следующего исключения:
Traceback (последний вызов был последним): File
"C: \ Users \ Клини \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ Lib \ сайта-пакеты \ Джанго \ ядро \ обработчики \ exception.py",
строка 34, во внутренней
response = get_response (запрос) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ core \ handlers \ base.py",
строка 126 в _get_response
response = self.process_exception_by_middleware (e, запрос) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ core \ handlers \ base.py",
строка 124 в _get_response
response = wrapped_callback (request, * callback_args, ** callback_kwargs) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ views \ decorators \ csrf.py" ,
строка 54, в wrapped_view
вернуть view_func (* args, ** kwargs) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ views \ generic \ base.py",
линия 68, в поле зрения
вернуть self.dispatch (request, * args, ** kwargs) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ rest_framework \ views.py",
линия 495, отправка
response = self.handle_exception (exc) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ rest_framework \ views.py",строка 455, в handle_exception
self.raise_uncaught_exception (exc) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ rest_framework \ views.py",
линия 492, отправка
response = обработчик (запрос, * args, ** kwargs) Файл "C: \ Users \ clini \ git \ net302API \ Test1 \ api \ views.py", строка 68, в записи
profile = serializer.save () Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ rest_framework \ serializers.py",
строка 209, в сохранении
self.instance = self.update (self.instance, validated_data) Файл "C: \ Users \ clini \ git \ net302API \ Test1 \ api \ serializers.py", строка 137, в
Обновить
Файл instance.save () "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ contrib \ auth \ base_user.py",
строка 73, в сохранении
super (). save (* args, ** kwargs) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ db \ models \ base.py" ,
строка 718, в сохранении
force_update = force_update, update_fields = update_fields) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ db \ models \ base.py",
строка 748, в save_base
Обновленный = self._save_table (raw, cls, force_insert, force_update, using, update_fields) Файл
"C: \ Users \ Клини \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ Lib \ сайта-пакеты \ Джанго \ дб \ модели \ base.py",
строка 812, в _save_table
принудительное_датирование) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ db \ models \ base.py",
строка 861, в _do_update
вернуть фильтрованное значение__данных (значения)> 0 Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ db \ models \ query.py",
строка 712, в _update
вернуть файл query.get_compiler (self.db) .execute_sql (CURSOR) "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ db \ models \ sql \ compiler" .py»,
строка 1383, в execute_sql
курсор = super (). execute_sql (тип_результата) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ db \ models \ sql \ compiler.py",
строка 1065, в execute_sql
cursor.execute (sql, params) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ db \ backends \ utils.py",
строка 100, в исполнении
return super (). execute (sql, params) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ db \ backends \ utils.py",
строка 68, в исполнении
вернуть файл self._execute_with_wrappers (sql, params, many = False, executor = self._execute)
"C: \ Users \ Клини \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ Lib \ сайта-пакеты \ Джанго \ DB \ движки \ utils.py",
строка 77, в _execute_with_wrappers
return executor (sql, params, many, context) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ db \ backends \ utils.py",
строка 85, в _execute
return self.cursor.execute (sql, params) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ db \ utils.py",
линия 89, выход
поднять dj_exc_value.with_traceback (traceback) из файла exc_value "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ db \ backends \ utils.py",
строка 85, в _execute
return self.cursor.execute (sql, params) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ django \ db \ backends \ mysql \ base.py" ,
строка 71, в исполнении
return self.cursor.execute (query, args) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ MySQLdb \ cursors.py",
строка 250, в исполнении
self.errorhandler (self, exc, value) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ MySQLdb \ connections.py",
строка 50, в defaulterrorhandler
поднять значение ошибки в файле "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ MySQLdb \ cursors.py",
строка 247, в исполнении
res = self._query (запрос) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ MySQLdb \ cursors.py",
строка 412, в _query
rowcount = self._do_query (q) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ MySQLdb \ cursors.py",
строка 375, в _do_querydb.query (q) Файл "C: \ Users \ clini \ MYDOCU ~ 1 \ LICLIP ~ 1 \ NET302 ~ 1 \ lib \ site-packages \ MySQLdb \ connections.py", строка 276, в запросе _mysql.connection.query(self, query) django.db.utils.DataError: (1406, «Данные слишком длинные для столбца« заголовок »в строке 1»)