在django restful framework中設置django model的property

衆所周知,在django的model中,能夠某些字段設置@property和setter deleter getter,這樣就能夠在存入數據的時候進行一些操做,具體原理請參見廖雪峯大神的博客https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820062641f3bcc60a4b164f8d91df476445697b9e000數據庫

但是在個人實現中,若是在數據庫中實現了setter方法,在使用django restful framework序列化後,這個property會被自動忽略,具體表現就是雖然傳入了這個屬性的值,可是在最終寫入數據庫時根本看不見這個,寫入的是空值。django

這是個人代碼restful

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行有這麼一行代碼ui

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

調試能夠看到在self.initial_data中能夠看到個人字段,但是在self._validated_data中沒法看到這個字段。spa

再往下查查不到了,繼承的太亂了,實在不知道這種大型項目是怎麼維護的。調試

實在無法了,只能在視圖中重載了perform_create方法看下取到的值是什麼rest

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

看到serializer中關於superpassword這一行是code

superPassword = ReadOnlyField()

花擦,原來問題在這裏,他直接把這個字段給我置爲只讀了,吐血orm

怎麼解決呢?只能在序列化的時候在類中加一個屬性blog

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

    class Meta:
    省略

這樣就行了,原來如北,寫篇博客聲討一下這個大坑

相關文章
相關標籤/搜索