2010-09-20 85 views
34

我一直在開發Django中的一些RESTful服務,以便與Flash和Android應用程序一起使用。在Django中序列化外鍵對象

開發服務接口非常簡單,但我一直在遇到序列化具有外鍵和多對多關係的對象的問題。

我有這樣一個模型:

class Artifact(models.Model): 
    name    = models.CharField(max_length = 255) 
    year_of_origin  = models.IntegerField(max_length = 4, blank = True, null = True) 
    object_type   = models.ForeignKey(ObjectType, blank = True, null = True) 
    individual   = models.ForeignKey(Individual, blank = True, null = True) 
    notes    = models.TextField(blank = True, null = True) 

然後,我會在這個模型是這樣執行查詢,使用select_related(),以確保外鍵關係如下:

artifact = Artifact.objects.select_related().get(pk=pk) 

一旦我有了對象,我將它序列化,然後將其傳回給我的視圖:

serializers.serialize("json", [ artifact ]) 

這就是我回來的,注意外鍵(object_type和個人)只是它們相關對象的id。

[ 
     { 
      pk: 1 
      model: "artifacts.artifact" 
      fields: { 
       year_of_origin: 2010 
       name: "Dummy Title" 
       notes: "" 
       object_type: 1 
       individual: 1 
      } 
     } 
] 

這是偉大的,但我希望用select_related()時是,它會自動填充外鍵字段與相關對象,而不僅僅是對象的ID。

我最近轉換爲Django,但是花了相當多的時間用CakePHP進行開發。

我真正喜歡Cake ORM的是,它會遵循關係並默認創建嵌套對象,並且可以在調用查詢時解除關係。

這使得以一種不需要任何干預措施的方式抽象服務變得非常容易。

我看到Django默認不會這樣做,但有沒有辦法自動序列化一個對象及其所有相關的對象?任何提示或閱讀將不勝感激。

+1

[PEP-008](http://www.python.org/dev/peps/pep-0008) – 2013-11-13 05:50:44

回答

24

我有類似的要求,雖然不是用於RESTful目的。我能夠通過使用「完整」序列化模塊來實現我所需要的功能,在我的案例Django Full Serializers中。這是wadofstuff的一部分,並在新的BSD許可證下發布。

Wadofstuff使這很容易。對於例如在您的情況下,您需要執行以下操作:

首先,安裝wadofstuff。

其次,添加以下設置將settings.py文件:

SERIALIZATION_MODULES = { 
    'json': 'wadofstuff.django.serializers.json' 
} 

三是要用於序列化的代碼略有變化:

artifact = Artifact.objects.select_related().get(pk=pk) 
serializers.serialize("json", [ artifact ], indent = 4, 
    relations = ('object_type', 'individual',)) 

關鍵的變化是relations關鍵字參數。唯一的(小問題)是使用形成關係的字段的名稱而不是相關模型的名稱。

買者

documentation

STUFF的彈塞串行序列化模型時與Django的串行器100%兼容。 反序列化數據流時,Deserializer類當前僅適用於由標準Django串行器返回的序列化數據。

(強調)

希望這有助於。

10

UPDATE: 其實馬諾的解決方案是一個有點過時,東西的串行器的Wad有一段時間沒有更新,當我嘗試時,似乎它不再支持Django 1.6了。但是,請看Django's official doc here。它提供了一些使用內置自然鍵的方法。似乎django的內置序列化程序在支持使用ImageField作爲自然鍵的一部分時遇到了一些問題。但是,這可以很容易地由你自己修復。

+0

謝謝!我忘了自然鑰匙;) – 2016-02-14 02:06:04

+0

@沉浩晨,你的鏈接似乎不再可及。但我同意你的看法,上述解決方案已經過時。你能否刷新鏈接? – 2016-04-30 21:51:15