1. 程式人生 > >djang模型類中BinaryField欄位的序列化輸出問題和外來鍵問題

djang模型類中BinaryField欄位的序列化輸出問題和外來鍵問題

最近在專案開發時進行模型類設計時遇到了一些問題,在這裡和大家分享以下

1.BinaryField欄位的序列化輸出問題

專案經理的需求是將多個不同資料庫的查詢結果資訊存放到另一個關係型資料庫(比如mysql1)中,那麼多個數據庫的查詢資訊的欄位上,型別上都不相同,這導致我在儲存資料庫(mysql1)中無法頂一個各個欄位,所以我就需要將查詢結果當作一個大欄位存入到一個欄位中,但是因為查詢結果的長度不可控,且後期資料可能大量擴充套件,所以如果按照CharFiled的方式儲存就很不方便了,因為CharField需要定義長度,不利於擴充套件,不方便大資料使用,所以想到了file和binary,此處需求沒必要使用file,所以最後使用BinaryFiled(看需求選擇),那麼在選擇BinaryFiled之後,儲存時需要進行資料的encode,因為BinaryFiled只能進行二進位制儲存,但是在輸出時,因為我之前使用的序列化器繼承了Modelserializer,導致輸出欄位直接按照儲存方式序列化輸出,沒有進行deocde,所以亂碼了,然後我就進行BinaryFiled自定義輸出,但是一直不起作用,依然輸出亂碼,那麼我分析了問題的根本在哪裡

,於是我在取出資料後和序列化之前,以及序列化之後對比,發現問題就出現在序列化器上,我要做的就是在序列化器之前將資料進行decode,那麼我檢視serializers原始碼時發現,當我們繼承Modelserializer時,程式自動按照class Meta的元類中指定的模型類進行序列化和輸出,自定義的輸出物件根本不執行,所以需要進行父類重選,可以使用Serializer來繼承,這樣的話保留了序列化的功能,同時可以進行輸出物件的重新,當然了,serializers中只提供了四個可以常用輸出的欄位IntegerFiled,CharField,BooleanField,DateTimeField,我選擇了CharFiled,問題最後解決了

2.外來鍵的原理

我們一個表中使用了UUID作為主鍵,我們姑且稱這個表為list1

我們的另一個表,姑且稱為list2,lsit2以list1_id為外來鍵,那麼我們做建立資料時,將list1的id儲存到list中時發現儲存錯誤,顯示uuid無法儲存,不是list1的屬性,我對這個問題一直糾結於uuid是否能做外來鍵,和uuid的儲存上,當時也是一時懵了,咱們仔細想一下這個原理,那麼一個表中的外來鍵指定另一個表,指向的是另一個表的物件,而不是它的一個ID,所以我要將id存入list2中,list1根本不知道自己指向的是哪一個物件,那麼就需要通過外來鍵儲存list的一個物件和不是id來進行儲存,這樣就成功了!