我正在使用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/"
}
]
}
謝謝 - 一旦我停止嘗試使UUID主鍵更好地工作。 Tastypie可以通過'detail_uri_name'設置URI中使用的內容,並且使UUIDField獨一無二,但不是主鍵,一切運行得更好。 – Hwesta