我正在開發一個Web應用程序,用戶可以在其中創建多個相關元素,然後將這些元素保存到數據庫。 Web應用程序不知道數據庫中的主鍵是什麼,因此它爲每個元素分配一個UUID。這些UUID與數據庫中的每個元素一起保存。當Web應用程序將數據發送到Web服務器以放入數據庫時,它會使用JSON對所有內容進行編碼。 JSON然後由網絡服務器使用serializers.deserialize('json', DATA)
進行反序列化。但是,某些模型具有外鍵,這些外鍵在JSON有效內容中發送,作爲對關聯元素的UUID的引用而不是數據庫ID。例如,我們可具有一個簡單的鏈接對象:如何在Django的模型中添加臨時字段?
class Link(models.Model):
uuid = models.CharField(max_length=32)
source = models.ForeignKey(Node, related_name='source')
target = models.ForeignKey(Node, related_name='target')
如果源有值的2的ID和目標具有值12的ID,這將被序列化到JSON作爲這樣的:
{"uuid": "[some long uuid]",
"source": 2,
"target": 12}
然而,因爲在這種情況下,我們不知道的源和目標的數據庫ID,可能是因爲他們尚未設置,我所能做的最好的是通過在UUID是這樣的:
{"uuid": "[some long uuid]",
"sourceuuid": "[uuid of source]",
"targetuuid": "[uuid of target]"}
不幸的是,th當我撥打serializers.deserialize
的數據時,引發了FieldDoesNotExist: Link has no field named u'sourceuuid'
的例外。
我想找到一種方法,我可以通過UUID進入,然後讓數據庫填入ID,一旦它保存了適當的部分或在必要時查找它們。我不想將sourceuuid
和targetuuid
保存在數據庫中,因爲保存整數的空間較少,並且指示速度也應該更快。
所以,我正在尋找的是一個臨時的領域。一個我可以實例化並引用,但永遠不會保存回數據庫。任何想法,我會如何創造這樣的事情?
更新與更多的澄清
感謝您的幫助,到目前爲止,我知道,他們是Python對象,我可以指定任意字段的對象。但是,問題是serializers.deserialize('json', INDATA)
會引發錯誤。
僅供參考下面是JSON的一個大塊的解串器喜歡,它有外鍵用自己的ID:
ser='''[{"pk": 1, "model": "myapp.link",
"fields": {"uuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"source": 2,
"target": 12}}]'''
serializer.deserialize('json',ser)
不過,我可以提供的是:
ser='''[{"pk": 1, "model": "myapp.link",
"fields": {"uuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"sourceuuid": "11111111-2222-3333-4444-555555555555",
"targetuuid": "66666666-7777-8888-9999-000000000000"}}]'''
serializer.deserialize('json',ser)
FieldDoesNotExist: Link has no field named u'sourceuuid'
原因我需要虛擬場是一個實際的領域,因爲deserialize
需要實際的領域。
這是最接近的,但不是你所期望的。一個到非物化Django模型的ForeignKey仍然在引用表中添加一列。但是,如果我使用'sourceuuid'和'targetuuid'作爲新字段創建一個完整的非物化子類,我可以到某處。我在一個新的'LinkJSON'類中反序列化,然後映射UUID,然後將這些字段複製到'Link'類。它不漂亮,但它有點不錯。如果Python有一個簡單的方法將類型轉換爲基類,那將會更好。 – Pridkett 2009-12-12 14:50:07
我接受這個答案,因爲它最接近我想要做的。我不得不做一些時髦的子類化,然後創建一個JSONSerializer的子類來處理所有事情,但它現在起作用了。不幸的是,它成爲一個非常具體的解決方案,所以我不能將它的全部內容發佈到StackOverflow。 – Pridkett 2010-01-04 19:48:05