Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django tastypie在get中返回空资源\ u uri_Django_Tastypie - Fatal编程技术网

Django tastypie在get中返回空资源\ u uri

Django tastypie在get中返回空资源\ u uri,django,tastypie,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

这就是资源

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
返回空的
资源\u 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()
它不起作用,我很确定它不需要特别护理


我错过了什么

尝试删除object\u类,我认为如果这是ModelResource,您不需要它。

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

myapi.register(TagResource())

这可能是因为,出于某种原因,api_名称丢失。 尝试将其添加到资源元中。 例如,如果资源uri为/api/v1/YourResourceName,请尝试添加资源元:

api_name = 'v1'

希望它能有所帮助。

我知道这很旧,但我知道你的问题,我的问题就在我的问题上,你在API URL include上或在URL树中的任何URL include上都有一个“名称空间”

只有当其他人在URL.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, 
        }
然后输入模块的URL.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)),
)

查看帖子。

我已经创建了一个博客来强调同样的问题。链接到

Tastypie提供了两个选项来创建模型资源

  • 模型资源
  • 名称空间模型资源
  • 当名称空间包含在urls.py中时,生成资源uri的Tastypie逻辑将失败,因为它还希望api URL中包含相同的名称空间。要克服这个问题,必须从模块级url.py中删除名称空间,或者使用tastype实现名称空间。第一个解决方案看起来很简单,但可能会破坏您的应用程序。下面的代码将帮助您使用第二种方法

    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()
    
    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)),
    )
    
    mymodule/url.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()
    
    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 URL使用相同的命名空间。上面的代码肯定会生成正确的资源uri。

    我仍然会在响应中得到一个空的
    资源uri
    。我所有的资源都已经在
    url.py中注册了,感谢您的延迟响应,但我已经切换到Rest framework.tnx。。我也有同样的问题,那是因为namespace@haki这是正确的答案,所以如果你想接受它,那就太好了:)这是对的。请参阅另一个答案,以获得更彻底的处理。这是一个写得很好、非常准确的答案。谢谢你抽出时间!