Django Restful: Как мне обновить мою пользовательскую модель? - PullRequest
0 голосов
/ 02 января 2019

Я создаю 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»)

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Итак, чтобы закрыть эту проблему, я нашел решение. Когда я писал метод обновления для моего сериализатора, я писал их как instance.fieldname =validated.data.get('input_name'),instance.fieldname

Когда они должны были instance.fieldname =validated.data.get('input_name',instance.fieldname)

Спасибо всем за помощь:)

0 голосов
/ 02 января 2019

Возможно, вы обновили max_length заголовка и еще не мигрировали?

...