我正在构建一个API作为大学项目的一部分,但是,在研究如何对自定义用户模型进行更新时,我陷入了困境。目前,我有一个用于更新配置文件的序列化程序,但是当我尝试使用序列化程序更新表时,它将失败并显示错误1406:“数据太长,导致第1行的列'title'不足”。我目前不确定如何解决此问题,并且想知道是否有人可以指出我正确的方向
更新: 因此,看来我获取数据的时间太长了以至于出现列错误,因为我拥有的代码将追加到列中,而不是仅在JSON包含字段数据时更改它们,否则就保留它们。因此,一旦我修改了列的长度,我就会得到以下数据库行:
(无,'安东尼'),(无,(无,'安东尼')),1,0,1,1,2019-01-01,('a 测试地址”,“ hello”),(无,无),(无,无),edd,(无, 'boy'),(无,'有'),(无,无),(无,'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 /追溯(最近的呼叫 最后):文件 “ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ django \ db \ backends \ utils.py”, _execute中的第85行 返回self.cursor.execute(sql,params)文件“ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ django \ db \ backends \ mysql \ base.py” , 第71行,执行 返回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”, _query中的第412行 rowcount = self._do_query(q)文件“ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ MySQLdb \ cursors.py”, _do_query中的375行 db.query(q)文件“ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ MySQLdb \ connections.py”, 第276行,在查询中 _mysql.connection.query(自己,查询) _mysql_exceptions.DataError:(1406,“数据太长,导致第1行的列'title'不足”)
上述异常是以下异常的直接原因:
回溯(最近通话最近):文件 “ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ django \ core \ handlers \ exception.py”, 第34行,在内部 响应= get_response(请求)文件“ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ django \ core \ handlers \ base.py”, _get_response中的第126行 响应= self.process_exception_by_middleware(e,request)文件“ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ django \ core \ handlers \ base.py”, _get_response中的第124行 响应= wraped_callback(请求,* 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行,正在调度中 响应= 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行,正在派遣中 响应=处理程序(请求,* 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”, save_base中的第748行 已更新= self._save_table(原始,cls,force_insert,force_update,使用,update_fields)文件 “ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ django \ db \ models \ base.py”, _save_table中的第812行 强制更新)文件“ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ django \ db \ models \ base.py”, _do_update中的861行 _update(values)> 0文件“ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ django \ db \ models \ query.py”, _update中的第712行 返回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中 cursor = super()。execute_sql(result_type)文件“ 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行,在执行中 返回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 \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ django \ db \ backends \ utils.py”, 第77行,在_execute_with_wrappers中 返回执行程序(sql,params,许多,上下文)文件“ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ django \ db \ backends \ utils.py”, _execute中的第85行 返回self.cursor.execute(sql,params)文件“ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ django \ db \ utils.py”, 第89行,退出 从exc_value文件“ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ django \ db \ backends \ utils.py”中提高dj_exc_value.with_traceback(traceback), _execute中的第85行 返回self.cursor.execute(sql,params)文件“ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ django \ db \ backends \ mysql \ base.py” , 第71行,执行 返回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”, _query中的第412行 rowcount = self._do_query(q)文件“ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ MySQLdb \ cursors.py”, _do_query中的375行 db.query(q)文件“ C:\ Users \ clini \ MYDOCU〜1 \ LICLIP〜1 \ NET302〜1 \ lib \ site-packages \ MySQLdb \ connections.py”, 第276行,在查询中 _mysql.connection.query(自己,查询)django.db.utils.DataError:(1406,“数据太长,导致第1行的列'title'的数据太长”)
答案 0 :(得分:0)
您是否可能更新了标题的max_length并且还没有迁移?
答案 1 :(得分:0)
因此,为了解决此问题,我找到了解决方案。当我为序列化程序编写更新方法时,我将它们写为
instance.fieldname =validated.data.get('input_name'),instance.fieldname
什么时候应该
instance.fieldname =validated.data.get('input_name',instance.fieldname)
谢谢大家的帮助:)