首页 文章

当UUIDField是主键时,Tastypie不使用UUID返回URI

提问于
浏览
2

我正在使用Django和tastypie来开发REST API,其主键是来自django_extensions的UUIDField . 但是,使主键成为UUID并不适合使用tastypie:当我使用POST创建资源时,它返回的URI是一个int,而不是UUID,然后提供的URI不可用,因为其余的API需要用于访问资源的UUID .

我认为这是因为UUIDField只替换了Django pre_save中UUIDField中的值,而tastypie在此之前返回了头文件 .

我尝试为LocationResource编写自定义get_resource_uri,但传递给该函数的对象还没有UUID(只是正常的自动递增整数主键) .

如何让tastypie为资源返回正确的UUID?有没有更好的方法来制作一个UUID,tastypie会更好?

该模型:

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 回答

  • 1

    根据我的经验,我不会尝试使用UjID和django(作为主键) . 也许一些聪明的人已经开始工作了,但是我花了几个小时试图让uuids工作得很好,但这真是令人头疼 . 默认情况下,django期望主键是整数,并且大多数django扩展都有相同的假设 .

    Tastypie使用django的核心解析器来生成位置,因此问题实际上并未局限于tastypie . 如果你想要UUID工作,你可能需要分叉django并进行自己的更改,这绝对不是推荐的 .

    在一天结束时,你的URI中没有你的uuid实际上不应该太重要 . URI的概念是它独立于模型记录,即uri不必包含模型的主键 . URI本身就是资源(读取对象)的唯一标识符,因此它不应该是您的大问题 .

相关问题