【问题标题】:tastypie return empty resource_uri in get美味派在get中返回空的resource_uri
【发布时间】:2014-03-26 16:33:15
【问题描述】:

这是资源

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()

它不起作用,我很确定它不需要特别照顾。

我错过了什么?

【问题讨论】:

    标签: django tastypie


    【解决方案1】:

    我知道这是旧的,但我知道你的问题,我刚刚有它,你有一个“命名空间”在 API URL 包括或任何 URL 包括进一步在你的 URL树。

    【讨论】:

    • 感谢您的回复,但我已切换到 Rest 框架。
    • tnx.. 我有同样的问题,这是因为命名空间
    • @haki 这是正确的答案,所以如果想接受它会很好:)
    • 这是对的。请参阅另一个答案stackoverflow.com/a/22687870/2501018 以获得更彻底的处理。
    【解决方案2】:

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

    myapi.register(TagResource())
    

    【讨论】:

    • 谢谢哥们。我所有的资源都已经注册在urls.py
    【解决方案3】:

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

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

    1. 模型资源
    2. 命名空间模型资源

    当命名空间包含在 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 url 使用相同的命名空间。上面的代码肯定会生成正确的resource_uri。

    【讨论】:

    • 这是一个写得很精彩且准确的答案。感谢您抽出宝贵时间!
    【解决方案4】:

    尝试去掉object_class,我觉得如果这是ModelResource,就不需要这个了。

    【讨论】:

    • 我在回复中仍然得到一个空的resource_uri
    【解决方案5】:

    这可能是因为,由于某种原因,缺少 api_name。 尝试将其添加到资源元中。 例如,如果您的资源 uri 是 /api/v1/YourResourceName,请尝试在您的资源 Meta 中添加:

    api_name = 'v1'
    

    希望对你有帮助。

    【讨论】:

      【解决方案6】:

      仅当其他人遇到由 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 的帖子。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 1970-01-01
        • 1970-01-01
        • 2012-10-30
        • 2014-01-23
        • 1970-01-01
        • 2012-04-18
        相关资源
        最近更新 更多