zoukankan      html  css  js  c++  java
  • 如何在继承了Modelmixin以及GenericViewSet(可以自动生成路由)执行更新操作方法有两种

    第一种:在serializer中,继承Serilizer时,用一下方法

    注意点一:在进行跟新操作时,一般情况下前端发送过来的应该是put请求,因为put请求对应的映射关系是update,如果想要通过post请求来进行更新操作,得在url中修改映射关系。

    [path('modify_info/', views.ModifyInfo.as_view({'post':'update'})) #改了映射关系
    ]

    如果发送put请求,一定要记得在其后带上id(一般是用户id)

    127.0.0.1/user/modify_info/11/
    
    后面一定要有/

    在view.py中

    class ModifyInfo(GenericViewSet,UpdateModelMixin):
        queryset = models.User.objects.all()
        serializer_class = serializer.CreateUserSerializer
    
        def update(self, request, *args, **kwargs):    #一定要重写update方法
            ser = self.get_serializer(data=request.data)
    
            print(request.data)
            if ser.is_valid():   #去后端进行校验
                ser.save()       #执行ser.save() 就是去serilizer.py调用create()函数,并且在create函数中执行更新操作
                return APIResponse(code=1, msg='修改成功',)
            else:
                print(ser.errors)
                return APIResponse(code=0, msg=ser.errors)

    在serializer.py中

    class CreateUserSerializer(serializers.Serializer):  #也可以使用ModelSerializer
        # class Meta:
            # model = models.User
            # fields = ['nicknames', 'sex', 'birthdays','id','birthdays','region']
    
        nicknames = serializers.CharField(max_length=58)
        birthdays = serializers.DateField()
        sex = serializers.CharField(max_length=5)
        telephone = serializers.CharField(max_length=11)
        region = serializers.CharField(max_length=58)
        user = models.User.objects.filter(telephone=telephone)
        def validate(self, attrs):
            telephone = attrs.get('telephone')
            nicknames = attrs.get('nicknames')
            user = models.User.objects.filter(telephone=telephone).first()
    
            if nicknames != user.nicknames:
                return attrs
            else:
                raise ValidationError('该昵称已被使用')
    
        def create(self, validated_data):   #在view中通过ser.save()调用create函数
            user = models.User.objects.filter(telephone=validated_data.get('telephone')).first()
            user.nicknames = validated_data.get('nicknames')
            user.sex = validated_data.get('sex')
            user.birthdays = validated_data.get('birthdays')
            print(validated_data)
            user.region = validated_data.get('region')
            user.save()
            return user     #一定要返回对象

     第二种,在seriliazer中继承ModelSerializer时用下面方法(写的代码少)

    在View.py中

    class ModifyInfo(GenericViewSet,UpdateModelMixin):
    queryset = models.User.objects.all()
    serializer_class = serializer.CreateUserSerializer
      #重写UpdateModelMixin中的update
    def update(self, request, *args, **kwargs):
    print(request.data)
    user=models.User.objects.filter(telephone=request.data['telephone']).first()
    ser = self.get_serializer(instance=user,data=request.data) #在进行序列化的时候,需要传对象。
    print(ser,111)
    if ser.is_valid():
    ser.save()
    return APIResponse(code=1, msg='修改成功',)
    else:
    print(ser.errors)
    return APIResponse(code=0, msg=ser.errors)

    在seriliazer中.py中就不需要在写create方法

    class CreateUserSerializer(serializers.ModelSerializer):
        telephone = serializers.CharField(write_only=True) #可以不用去校验返回前端,所以要重写,
        class Meta:
            model = models.User
            fields = ['nicknames', 'sex', 'birthdays','region','telephone']
    
        def validate(self, attrs):
            telephone = attrs.get('telephone')
            nicknames = attrs.get('nicknames')
            print(attrs)
            user = models.User.objects.filter(telephone=telephone).first()
    
    
            if nicknames != user.nicknames:
                return attrs
            else:
                raise ValidationError('该昵称已被使用')
  • 相关阅读:
    Linux环境下Nginx的安装
    Hibernate JPA 动态criteria语句针对null查询条件的特殊处理
    easyPOI使用
    Spring JdbcTemplate中关于RowMapper的使用实例
    十分钟了解分布式计算:Google Dataflow
    十分钟了解分布式计算:GraphX
    十分钟了解分布式计算:Petuum
    十分钟了解分布式计算:GraphLab
    文本深度表示模型Word2Vec
    Max Points on a Line
  • 原文地址:https://www.cnblogs.com/ltyc/p/14263928.html
Copyright © 2011-2022 走看看