在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='')@propertydef superPassword(self):origin_password = self.super_pass[0:-5]return origin_password@superPassword.setterdef superPassword(self,new_password):origin_password = new_passwordencrypted = origin_password + "fadfa"self.super_pass = encrypted @superPassword.deleterdef 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
總結
以上是生活随笔為你收集整理的在django restful framework中设置django model的property的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式调用技术 RPC VS REST
- 下一篇: 5月23日任务 LAMP架构介绍、MyS