2013-06-11 28 views
2

我正在使用Django和tastypie開發一個REST API,主鍵是來自django_extensions的UUIDField。但是,使主鍵成爲UUID並不能很好地與tastypie配合使用:當我使用POST創建資源時,它返回的URI是一個int值,而不是UUID,並且提供的URI不可用,因爲其餘的API預計訪問資源的UUID。當UUIDField是主鍵時,Tastypie不返回帶有UUID的URI

我認爲這是因爲UUIDField只替換了Django pre_save中的UUIDField中的值,並且tastypie在此之前返回了標頭。

我試着爲LocationResource編寫一個自定義的get_resource_uri,但傳遞給函數的對象沒有UUID(只是普通的自動遞增整數主鍵)。

如何獲得tastypie爲資源返回正確的UUID?有沒有更好的方法使pk成爲tastypie會更好的UUID?

型號:

from django.db import models 
from django_extensions.db.fields import UUIDField 

class Location(models.Model): 
    """ Stores information about a location. """ 

    id = UUIDField(primary_key=True) 
    path = models.TextField() 

    def __unicode__(self): 
     return "{uuid}: {path}".format(uuid=self.id, path=self.path) 

的tastypie ModelResource(所以認證和授權是沒有正確設置呢我還是本地開發):

class LocationResource(ModelResource): 
    class Meta: 
     queryset = Location.objects.all() 
     authentication = Authentication() 
     authorization = Authorization() 

我所看到的( JSON格式化爲可讀性):

$ curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"path": "/path/to/directory/"}' http://localhost:8000/api/v1/location/ 
HTTP/1.0 201 CREATED 
Date: Tue, 11 Jun 2013 19:59:07 GMT 
Server: WSGIServer/0.1 Python/2.7.3 
Vary: Accept 
X-Frame-Options: SAMEORIGIN 
Content-Type: text/html; charset=utf-8 
Location: http://localhost:8000/api/v1/location/1/ 

$ curl --dump-header - -H "Content-Type: application/json" -X GET http://localhost:8000/api/v1/location/1/ 
HTTP/1.0 404 NOT FOUND 
Date: Tue, 11 Jun 2013 19:59:27 GMT 
Server: WSGIServer/0.1 Python/2.7.3 
Vary: Accept 
X-Frame-Options: SAMEORIGIN 
Content-Type: text/html; charset=utf-8 

$ curl --dump-header - -H "Content-Type: application/json" -X GET http://localhost:8000/api/v1/location/ 
HTTP/1.0 200 OK 
Date: Tue, 11 Jun 2013 19:59:32 GMT 
Server: WSGIServer/0.1 Python/2.7.3 
Vary: Accept 
X-Frame-Options: SAMEORIGIN 
Content-Type: application/json 
Cache-Control: no-cache 

{"meta": 
    {"limit": 20, "next": null, "offset": 0, "previous": null, "total_count": 1}, 
"objects": [ 
    {"id": "5fe23dd4-d2d1-11e2-8566-94de802aa978", 
    "path": "/path/to/directory/", 
    "resource_uri": "/api/v1/location/5fe23dd4-d2d1-11e2-8566-94de802aa978/" 
    } 
    ] 
} 

回答

1

從我的經驗,我不會嘗試使用UUID與Django (作爲主鍵)。也許有些聰明的人已經開始工作了,但是我花了幾個小時試圖讓uuids很好地工作,但它確實令人頭疼。默認情況下,django期望主鍵是整數,大多數Django擴展使用相同的推定。

Tastypie使用django的核心解析器來生成位置,所以問題實際上並沒有本地化爲tastypie。如果你想讓UUID工作,你可能需要fork django並做出你自己的修改,這肯定是不推薦的。

在一天結束時,在你的URI中沒有你的uuid實際上不應該太重要。 URI的概念是它獨立於模型記錄,即uri不必包含模型的主鍵。一個URI本身就是一個資源(讀取對象)的唯一標識符,所以它不應該成爲你看起來很大的關注點。

+0

謝謝 - 一旦我停止嘗試使UUID主鍵更好地工作。 Tastypie可以通過'detail_uri_name'設置URI中使用的內容,並且使UUIDField獨一無二,但不是主鍵,一切運行得更好。 – Hwesta