2013-02-14 58 views
1

我配置了一個簡單的API和資源,連接到現有的數據庫(這就是爲什麼我需要指定模型中的表名稱和列)。我可以正常創建和列出對象。但是,當我創建一個,我從來沒有正確地獲得位置標題,也不能返回創建的數據。python django-tastypie對象創建不正確返回數據

創建對象:

curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"system_key": "test","system_nam": "test","system_url": "https://test/test"}' http://127.0.0.1:7000/api/system/?ticket=TGT-585-d9f9effb36697401dce5efd7fc5b3de4 

響應:

HTTP/1.0 201 CREATED 
Date: Thu, 14 Feb 2013 18:58:17 GMT 
Server: WSGIServer/0.1 Python/2.7.3 
Vary: Accept 
Content-Type: text/html; charset=utf-8 
Location: http://127.0.0.1:7000/api/system/None/ 

通知Location頭。看起來對象已成功創建,但信息不會從數據庫返回到API,因此可用於響應。爲了清楚起見,該行在數據庫表上是完美的。

如果我添加always_return_data = True我得到這個:

HTTP/1.0 400 BAD REQUEST 
Date: Thu, 14 Feb 2013 19:00:32 GMT 
Server: WSGIServer/0.1 Python/2.7.3 
Content-Type: application/json 

{"error": "The object '<system: MRMteste>' has an empty attribute 'system' and doesn't allow a default or null value."} 

我的資源和模式是非常簡單:

資源:

class SystemResource(ModelResource):  
    class Meta:   
     list_allowed_methods = ['get', 'post'] 
     detail_allowed_methods = ['get', 'put','patch'] 

     queryset = system.objects.all() 
     resource_name = 'system' 
     authorization = Authorization() 
     authentication = customAuth.CustomAuthentication() 

    def hydrate_system_timestamp(self, bundle):   
     bundle.data['system_timestamp'] = get_now_time() 
     return bundle 

型號:

class system(models.Model): 
    list_display = ('system_nam') 
    system = models.IntegerField(primary_key=True, db_column="system_id") 
    system_nam = models.CharField(max_length=50) 
    system_key = models.CharField(max_length=255) 
    system_url = models.CharField(max_length=100) 
    is_deleted_flg = models.BooleanField() 
    system_timestamp = models.DateTimeField(default=datetime.now) 

    def __unicode__(self): 
     return self.system_nam 

    class Meta: 
     db_table = "system" 

有關這方面的文檔沒有任何內容。任何有豐富經驗的人都可以告訴我模型和資源是否正確? 截至此日期,我正在使用最新版本的tastypie和django。

多謝

回答

1

其實我已經解決了這個問題。

在模型上,如果您需要像我一樣定義列名稱,請不要在主鍵上使用IntegerField。 像這樣做:

system = models.AutoField(primary_key=True, db_column="system_id") 

tastypie看起來是新創建的對象後的方式,它需要在模型中定義的自動遞增,所以它知道最後創建的ID。 好的發現,希望有一天能幫助別人。

1

你必須在元類資源的設置:

always_return_data = True 

,並嘗試唯一ID字段是與默認名稱標識不服務。

+0

如果我把這個添加到類中,我得到一個醜陋的400錯誤。問題在別處。 – 2013-02-15 13:02:21