2012-02-10 61 views
2

當我嘗試通過我的項目API創建一個帶有外鍵的對象(在本例中爲2)時,tastypie嘗試創建相關對象(此處訂購&參與者) :django-tastypie嘗試在POST請求上創建相關對象

class ParticipationResource(ModelResource): 
    order = fields.ForeignKey(Order, 'order', full=True,) 
    participant = fields.ForeignKey(UserProfile, 'participant', full=True) 

    class Meta: 
     authorization = Authorization() 
     queryset = Participation.objects.all() 
     resource_name = 'participation' 
     fields = ['id', 'order', 'participant', 'products', 'created_at', 'modified_at'] 
     filtering = { 
      'participant': ALL 
     } 
     detail_allowed_methods = ['get', 'post', 'put', 'delete',] 
     always_return_data = True 

數據貼:

{ 
    "order": { 
     "id":"1", 
     "resource_uri":"/api/v1/order/1/" 
     ... 
     }, 
    "participant":{ 
     "id":"1", 
     "resource_uri":"/api/v1/participant/1/" 
     ... 
     }, 
    "products":[] 
    } 

錯誤消息(NETWORK_ID是所述用戶簡檔模型外鍵):

"error_message": "app_user_profile.network_id may not be NULL", 

正如你可以看到我發送我的POST請求中的完整對象,我只用了resource_uri嘗試,它工作正常,問題是我需要客戶端渲染的全部對象(我使用Backbone和該模型會自動呈現)。那我該怎麼辦?有沒有辦法告訴tastypie不要創建相關的對象?

+0

你問的是如何有Tastypie返回完整嵌套的對象,但是當你回發時,Backbone只會POST resource_uri,而不是嵌套對象的完整JSON? 您是使用Backbone-Tastypie還是Backbone-Relational來處理事物的骨幹一側的嵌套對象?或者,所以你有一個自定義的parse()函數? – 2012-02-10 15:32:29

+0

我想只使用完整的對象,以便能夠自動在Backbone的一側渲染嵌套對象,但似乎Tastypie無法處理相關對象,並嘗試創建新的,當我們不給resource_uri時(雖然resource_uri在裏面物體)。我使用Backbone-Tastypie和自定義parse()函數。 – djevg 2012-02-10 16:11:06

+0

你有一個小錯字,字段(。)ForeignKey – 2012-04-04 09:06:27

回答

6

當您將TastyPie設置爲full = True時,它將以雙向方式工作 - 它會返回完整的嵌套對象,但也會接受完整的嵌套對象。

你需要做的是配置Backbone來不發送嵌套對象的完整JSON,但只是resource_uri。

有幾種方法可以做到這一點 - 一種方法是使用Backbone-Relational,它負責解析和創建嵌套模型 - 因此您不必執行自定義分析()。

另一種方法是使用Backbone-Tastypie(由同一作者),它是Backbone-Relational代碼的一個子集,使它更易於與TastyPie一起使用。

但是,如果你想堅持你擁有的東西,你需要編寫一個自定義的toJSON函數,它只返回resource_uri而不是嵌套對象。

這使骨幹型號不變,但,當他們序列化到被髮送到服務器,只有資源URI用於:

{ 
    "order": "/api/v1/order/1/", 
    "participant":"/api/v1/participant/1/", 
    "products":[] 
    } 
+0

謝謝,我試圖提取Tastypie方面的resource_uri,但沒有考慮改變它在Backbone中的工作方式。我會先嚐試一下Backbone-Relational,然後嘗試編寫一個自定義的toJSON函數,如果我無法得到我想要的... – djevg 2012-02-10 16:57:58

+0

因爲不相關的原因我搬到了django-piston,所以我沒有這個問題了但我已經採用了Backbone-Relational(這非常有用),我認爲它會做到這一點。再次感謝。 – djevg 2012-02-14 14:17:22