在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:
    省略

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

转载于:https://www.cnblogs.com/wuxie1989/p/9014877.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值