这是资源
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()
它没有用,我很确定它不应该需要特别小心。
我缺少什么?
答案 0 :(得分:4)
我知道这已经过时了,但我知道你的问题,我只是拥有它,你有一个" 命名空间"在API URL上包含或在URL树中包括更多URL。
答案 1 :(得分:2)
我遇到了同样的问题,因为我忘了在urls.py中注册我的资源。 确保在urls.py文件中有类似的内容:
myapi.register(TagResource())
答案 2 :(得分:2)
我创建了一个博客来突出显示同样的问题。链接到my blog
Tastypie提供了几种创建模型资源的选项。
当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帖子。