tastypie在get中返回空resource_uri

时间:2014-03-26 16:33:16

标签: django tastypie

这是资源

class TagResource(ModelResource):
    user = tastypie.fields.ForeignKey(UserResource,'user')

    class Meta:
        queryset = Tag.objects.all()
        resource_name = 'tag'
        authorization= Authorization()
        object_class = Tag
        filtering = { 
            'name' : ALL, 
        }

简单的获取请求

http://localhost:8000/api/v1/tag/1/?format=json

返回空resource_uri

{"created": "2014-03-26T15:14:11.928068", 
 "id": 1, "name": "test", 
 "resource_uri": "", "user": ""}

为什么?

我试过

def hydrate_resource_uri(self, bundle): 
  return bundle.get_resource_uri()

它没有用,我很确定它不应该需要特别小心。

我缺少什么?

6 个答案:

答案 0 :(得分:4)

我知道这已经过时了,但我知道你的问题,我只是拥有它,你有一个" 命名空间"在API URL上包含或在URL树中包括更多URL。

答案 1 :(得分:2)

我遇到了同样的问题,因为我忘了在urls.py中注册我的资源。 确保在urls.py文件中有类似的内容:

myapi.register(TagResource())

答案 2 :(得分:2)

我创建了一个博客来突出显示同样的问题。链接到my blog

Tastypie提供了几种创建模型资源的选项。

  1. ModelResource
  2. NamespacedModelResource
  3. 当urls.py中包含名称空间时,生成resource_uri的Tastypie逻辑会失败,因为它也需要api url中的相同名称空间。要解决此问题,要么必须从模块级别urls.py中删除命名空间,要么使用Tastypie实现命名空间。第一个解决方案看起来很简单,但它可能会破坏您以下代码将帮助您使用第二种方法。

    Api.py

    from tastypie.resources import NamespacedModelResource
    
    class EntityResource(NamespacedModelResource):
        class Meta:
            queryset = Entity.objects.all()
            allowed_methods = ['get']
            resource_name = 'entity'
            authentication = SessionAuthentication()
            authorization = Authorization()
    

    mymodule/url.py

    from tastypie.api import NamespacedApi
    from mymodule.api import EntityResource
    
    v1_api = NamespacedApi(api_name='v1', urlconf_namespace='mymodule')
    v1_api.register(EntityResource())
    
    urlpatterns = patterns('',
        url(r'^api/', include(v1_api.urls)),
    )
    

    确保为模块及其API使用相同的命名空间。上面的代码肯定会生成适当的resource_uri。

答案 3 :(得分:0)

尝试删除object_class,我认为如果这是ModelResource,则不需要它。

答案 4 :(得分:0)

这可能是因为某些原因导致api_name丢失。 尝试将其添加到资源元数据中。 例如,如果您的资源uri是/ api / v1 / YourResourceName,请尝试在您的资源Meta中添加:

api_name = 'v1'

希望它有所帮助。

答案 5 :(得分:0)

仅当其他人因urls.py中的命名空间而导致此问题时才会出现此问题。您必须使用NamespacedModelResource而不是ModelResource:

from tastypie.resources import NamespacedModelResource

class TagResource(NamespacedModelResource):
    user = tastypie.fields.ForeignKey(UserResource,'user')

    class Meta:
        queryset = Tag.objects.all()
        resource_name = 'tag'
        authorization= Authorization()
        object_class = Tag
        filtering = { 
            'name' : ALL, 
        }

然后进入你的模块的urls.py

from tastypie.api import NamespacedApi

v1_api = NamespacedApi(api_name='v1', urlconf_namespace='your_module')
v1_api.register(TagResource())

urlpatterns = patterns(
    '',
    url(r'^api/', include(v1_api.urls)),
)

检查this帖子。