zoukankan      html  css  js  c++  java
  • 在django restful framework中设置django model的property

    众所周知,在django的model中,可以某些字段设置@property和setter deleter getter,这样就可以在存入数据的时候进行一些操作,具体原理请参见廖雪峰大神的博客https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820062641f3bcc60a4b164f8d91df476445697b9e000

    可是在我的实现中,如果在数据库中实现了setter方法,在使用django restful framework序列化后,这个property会被自动忽略,具体表现就是虽然传入了这个属性的值,但是在最终写入数据库时根本看不见这个,写入的是空值。

    这是我的代码

    class Host(models.Model):
        id = models.AutoField(primary_key=True)
        superPass = models.CharField(max_length=128, null=True, default='')
        @property
        def superPassword(self):
            origin_password = self.super_pass[0:-5]
            return origin_password
        
        @superPassword.setter
        def superPassword(self,new_password):
            origin_password = new_password
            encrypted = origin_password + "fadfa"
            self.super_pass = encrypted 
        
        @superPassword.deleter
        def superPassword(self):
            del self.super_pass

    可是插入的时候总是superpass无法插入。查找了源码,是在django-restful-framework目录下的 serializers.py的第236行有这么一行代码

    self._validated_data = self.run_validation(self.initial_data)

    调试可以看到在self.initial_data中可以看到我的字段,可是在self._validated_data中无法看到这个字段。

    再往下查查不到了,继承的太乱了,实在不知道这种大型项目是怎么维护的。

    实在没法了,只能在视图中重载了perform_create方法看下取到的值是什么

        def perform_create(self, serializer):
            print(serializer)
            print(type(serializer))
            serializer.save()

    看到serializer中关于superpassword这一行是

    superPassword = ReadOnlyField()

    花擦,原来问题在这里,他直接把这个字段给我置为只读了,吐血

    怎么解决呢?只能在序列化的时候在类中加一个属性

    class HostSerializer(serializers.ModelSerializer):
        superPassword = serializers.CharField(allow_null=True, label='superPassword', max_length=16, required=False)
    
        class Meta:
        省略

    这样就好了,原来如北,写篇博客声讨一下这个大坑

  • 相关阅读:
    弹出消息对话框ScriptManager
    DataTable 转成字符串数组
    用XmlSerializer进行xml反序列化的时候,程序报错: 不应有 <xml xmlns=''>
    意外的节点类型 Element。只能在简单内容或空内容上调用 ReadElementString 方法
    case when 对某个字段值分类讨论
    sql语句求百分比
    分页Sql语句
    数据库,ADO.NET(ADO),Oledb(Odbc)和编程语言关系框架图
    UIView的alpha、hidden和opaque属性之间的关系和区别
    IOS 入门开发之创建标题栏UINavigationBar的使用
  • 原文地址:https://www.cnblogs.com/wuxie1989/p/9014877.html
Copyright © 2011-2022 走看看