2011-05-26 39 views
1

[編輯:使用Django-1.1.1]Django的解串器,具有字段設置爲連載=假

您好,

我使用存儲一個blob django的類(字符串B64編碼更確切地說)對應於對象的圖標。

我將對象序列化爲json以與不同的前端客戶端進行通信。

我不希望暴露在JSON結果純圖標BLOB(但一定URL下的身份侍奉圖像),所以我的圖標區域被定義爲這樣的:

icon = models.TextField(null=True, serialize=False) 

但是,當時間來保存我的對象,我失去了我的圖標,因爲顯然,值不是由傳入的json詞典設置的。

我想寫一寫的黑客就像這樣:

class MyIconizedClass(models.Model): 
    def __init__(self, *args, **kwargs): 
     if self.pk is not None and self._icon is None: 
      old_self = MyIconizedClass.object.get(pk=self.pk) 
      self.icon = old.self.icon 

不是很滿意這一點,因爲它會在DB每次查詢,再加上,它會無限期遞歸如果圖標實際上是無。

另一種方法是重寫解串器。

有什麼解決方法,使用Django的內部機制?

回答

1

試試這個:

for deserialized_object in serializers.deserialize("json", data): 
    try: 
     existing_object = MyIconizedClass.objects.get(pk=deserialized_object.pk) 
     deserialized_object.icon = existing_object.icon 
    except MyIconizedClass.DoesNotExist: 
     pass  
    deserialized_object.save() 

它還查詢數據庫,但不會造成任何遞歸。

+0

這將工作,但我使用泛型代碼(對於所有對象類型)通過我的URL序列化/反序列化,所以我暫時不能使用它。但是,實現類型特定的代碼是完全可能的。 感謝您的提示! – 2011-05-26 12:06:36

0

我改變了我的模型,以減少查詢貪婪。

class MyIconizedClass(models.Model): 
    ... 
    ... 


class IconClass(models.Model): 
    obj = models.ForeignKey(MyIconizedClass) 
    blob = models.TextField() 

我只能查詢點播IconClass表,與某些網址的入口點,如

  • GET /圖標化/ 42 /圖標
  • PUT /圖標化/ 42 /圖標
  • 工作時DELETE/iconized/42 /圖標

訪問對象本身時,我不需要知道圖標(GET/iconized/42)。

相關問題