Django Restful:如何更新自定义用户模型?

时间:2019-01-02 14:48:07

标签: django django-rest-framework serializer

我正在构建一个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'的数据太长”)

2 个答案:

答案 0 :(得分:0)

您是否可能更新了标题的max_length并且还没有迁移?

答案 1 :(得分:0)

因此,为了解决此问题,我找到了解决方案。当我为序列化程序编写更新方法时,我将它们写为 instance.fieldname =validated.data.get('input_name'),instance.fieldname

什么时候应该 instance.fieldname =validated.data.get('input_name',instance.fieldname)

谢谢大家的帮助:)