在django restful framework中设置django model的property
眾所周知,在django的model中,可以某些字段設(shè)置@property和setter deleter getter,這樣就可以在存入數(shù)據(jù)的時(shí)候進(jìn)行一些操作,具體原理請(qǐng)參見(jiàn)廖雪峰大神的博客https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820062641f3bcc60a4b164f8d91df476445697b9e000
可是在我的實(shí)現(xiàn)中,如果在數(shù)據(jù)庫(kù)中實(shí)現(xiàn)了setter方法,在使用django restful framework序列化后,這個(gè)property會(huì)被自動(dòng)忽略,具體表現(xiàn)就是雖然傳入了這個(gè)屬性的值,但是在最終寫(xiě)入數(shù)據(jù)庫(kù)時(shí)根本看不見(jiàn)這個(gè),寫(xiě)入的是空值。
這是我的代碼
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可是插入的時(shí)候總是superpass無(wú)法插入。查找了源碼,是在django-restful-framework目錄下的?serializers.py的第236行有這么一行代碼
self._validated_data = self.run_validation(self.initial_data)調(diào)試可以看到在self.initial_data中可以看到我的字段,可是在self._validated_data中無(wú)法看到這個(gè)字段。
再往下查查不到了,繼承的太亂了,實(shí)在不知道這種大型項(xiàng)目是怎么維護(hù)的。
實(shí)在沒(méi)法了,只能在視圖中重載了perform_create方法看下取到的值是什么
def perform_create(self, serializer):print(serializer)print(type(serializer))serializer.save()看到serializer中關(guān)于superpassword這一行是
superPassword = ReadOnlyField()花擦,原來(lái)問(wèn)題在這里,他直接把這個(gè)字段給我置為只讀了,吐血
怎么解決呢?只能在序列化的時(shí)候在類(lèi)中加一個(gè)屬性
class HostSerializer(serializers.ModelSerializer):superPassword = serializers.CharField(allow_null=True, label='superPassword', max_length=16, required=False)class Meta:省略這樣就好了,原來(lái)如北,寫(xiě)篇博客聲討一下這個(gè)大坑
轉(zhuǎn)載于:https://www.cnblogs.com/wuxie1989/p/9014877.html
總結(jié)
以上是生活随笔為你收集整理的在django restful framework中设置django model的property的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 分布式调用技术 RPC VS REST
- 下一篇: 5月23日任务 LAMP架构介绍、MyS