2012-05-06 68 views
6

我正在處理一些簡單的django-tastypie資源,出現以下問題:如何使Django-Tastypie覆蓋資源(如果它已存在)?

想象一下,我正在構建一個簡單的評分系統。我有一個資源,稱爲Rating,它既有User也有Comment。每位用戶最多隻有一條評論。

我想製作一個通用資源,需要一個元組('user', 'comment')。然後,每當我使用新的Rating進行POST時,我希望它檢查usercomment字段以查看是否存在與這兩個字段匹配的評分。如果是這樣,覆蓋現有的資源,否則創建一個新的資源(以便任何API調用將總是通過Django的unique_together)。

我正在使用obj_get作爲起點,但很難理解如何正確覆蓋它以獲得此行爲。

回答

6

#tastypie IRC上討論:

這裏建議你不要改變標準的API的行爲,因爲這可能是在這個意義上危險的客戶端將無法看到整個API一致的行爲。

一個解決方案是讓Tastypie在嘗試創建Rating時返回4xx響應,在這種情況下客戶端將PATCH作爲現有評級。

但是,如果性能提升爲真的需要,那麼只有在客戶正式要求時才應該改變行爲。在你的情況下,這意味着將replace_existing_rating=True參數添加到POST請求中。

所以你的情況,如果你沒有決定你所需要的性能提升,你可以:

class CommentResource(ModelResource): 
    def obj_create(self, bundle, request=None, **kwargs): 
     if bundle.data.get("replace_existing_rating", False): 
      try: 
       bundle.obj = self._meta.object_class._default_manager.get(**conditions) 
      except self._meta.object_class.DoesNotExist: 
       bundle.obj = self._meta.object_class()