【问题标题】:How to overcome empty queryset clone issue in tastypie?如何克服美味派中的空查询集克隆问题?
【发布时间】:2013-12-26 18:30:02
【问题描述】:

我正在尝试创建 REST API,但遇到以下问题:

/tastypie/resources.py",第 1475 行,在 get_object_list
返回 self._meta.queryset._clone()
AttributeError:“NoneType”对象没有属性“_clone”


class ManageResource(ModelResource):

   class Meta(ModelResource.Meta):
       resource_name = 'resourceStatus'
       detail_allowed_methods = ['get']
       always_return_data = True
       default_format = 'application/json'

    def base_urls(self):
       return [
           url(r"^(?P<resource_name>%s)%s$" % (self._meta.resource_name, 
               trailing_slash()), self.wrap_view('dispatch_list'), 
               name="api_dispatch_list"),
           url(r"^(?P<resource_name>%s)/(?P<request_id>[\w\d_.-]+)%s$"
            % (self._meta.resource_name, trailing_slash()),
            self.wrap_view('dispatch_detail'), name="api_dispatch_detail"),
        ]

    def get_detail(self, request, **kwargs):
        id = int(kwargs["request_id"])
        return self._get_response(request, self.obj_get(request=request,id=id))

    @obj_wrapper
    def obj_get(self, request, id):
       result = Helper().status(id=id)    
       return {"info":{"start_time":result.get("start_time"),\
            "end_time":result.get("end_time"),\
            "status":result.get("status"),\
            "messages":result.get("messages")}}

我没有在元类中设置查询集,因为我从文件或某种静态资源中提取数据。

【问题讨论】:

  • 嗯,你能显示你的代码吗?
  • @qwertynl : 将代码包含在 desc 中,如果您需要更多信息,请告诉我。

标签: python api rest tastypie


【解决方案1】:

queryset 字段添加到资源的Meta。如果您没有使用标准的QuerySet,请覆盖get_object_list 方法。

【讨论】:

  • 感谢您花时间回答这个问题,我不使用查询集的原因是,响应“json”字符串将作为 obj_get 方法的一部分创建,我认为没有必要去带有查询集。定义查询集真的是强制性的吗?再次感谢您帮助我。
  • 由于您没有在资源中使用任何模型,我建议您使用常规的Resource 类。设置obj_get 以返回Helper()... 结果。将info 字段添加到该资源,类型为fields.DictField,并填写dehydrate_info。这样,您就可以将大部分逻辑分离到它应该属于的位置,并为扩展留出空间。
  • 谢谢@kroolik!!我不好的问题是由于缩进,因为这个美味的人试图在我的资源中执行父实现而不是实际方法。 :(
【解决方案2】:

我是这样实现的:

class SomeFakedResource(Resource):
    # list out your fields as usual
    test_quantity = fields.IntegerField(attribute='test_quantity')

    class Meta:
        resource_name = 'some_faked'
        allowed_methods = ['get']
        include_resource_uri = False

    def _calculate_test_quantity(self):
        # here's where I put the real work of calculating the field
        return 1

    def obj_get_list(self, bundle, **kwargs):
        return self.get_object_list(bundle.request)

    def get_object_list(self, request):
        self.test_quantity = self._calculate_test_quantity()
        return [self]

【讨论】:

  • 感谢您抽出宝贵时间马丁!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 2012-10-09
  • 1970-01-01
  • 2010-12-18
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多