【问题标题】:Tastypie API return only one object for given parametersTastypie API 只为给定参数返回一个对象
【发布时间】:2014-03-23 03:39:29
【问题描述】:

我正在覆盖 get_obj_list 函数。在一些参数和一个随机函数之后,我想返回一个与参数后面的实际对象相关的对象。这工作正常。我怎样才能只返回这个 obj 而不是一个条目列表?还有其他更适合我的功能吗?

class SentenceRandomResource(ModelResource):

    class Meta:
        queryset = Sentence.objects.filter()
        resource_name = 'sentence/random'
        always_return_data = True
        authorization = ReadOnlyAuthorization()
        filtering = {'internal': ALL}

    def obj_get_list(self, bundle, **kwargs):

        if 'case' in bundle.request.GET.keys() and 'lemma' in bundle.request.GET.keys() :
            if 'number'  in bundle.request.GET.keys() :
                words = Word.objects.filter(case = bundle.request.GET['case'], number = bundle.request.GET['number'], lemma = bundle.request.GET['lemma'])
            else :
                words = Word.objects.filter(case = bundle.request.GET['case'], lemma = bundle.request.GET['lemma'])
            number_of_words = len(words)
            if number_of_words > 0 :
                random_index = int(random.random()*number_of_words)+0
                random_word = words[random_index]
                sentence = random_word.sentence

                return [sentence]
            else: ...

        else: ...

【问题讨论】:

    标签: json django resources tastypie


    【解决方案1】:

    感谢prepend_url 方法,您可以添加一些未包含在 RESTful 原则中的特殊功能。

    import random
    from tastypie.http import HttpBadRequest
    
    class SentenceRandomResource(ModelResource):
    
        class Meta:
            queryset = Sentence.objects.filter()
            resource_name = 'sentence/random'
            always_return_data = True
            authorization = ReadOnlyAuthorization()
            filtering = {'internal': ALL}
    
        def prepend_urls(self, *args, **kwargs):
            name = 'get_one_random'
            return [url(r"^(?P<resource_name>%s)/%s%s$" %
                        (self._meta.resource_name, name, trailing_slash()),
                        self.wrap_view(name), name="api_%s" % name)]
    
        def get_one_random(self, request, **kwargs):
            """
            Gets one random sentence of sentences with provided `case` and `lemma` 
            params.
            """
            case = request.GET.get('case')
            lemma = request.GET.get('lemma')
            number = request.GET.get('number')
    
            if case and lemma:
                query_params = {'case': case, 'lemma': lemma}
                if number is not None:
                    query_params['number'] = number
                words = Word.objects.filter(**query_params)
    
                word = random.choice(words)
                return self.create_response(request, {'sentence': word.sentence.__dict__})
    
            else:
                return self.error_response(request, {'error': 'lemma and case are required.'},
                                           response_class=HttpBadRequest)
    

    使用示例:

    GET ..../sentence/random/get_one_random/?case=1&lemma=2
    
    {'sentence': 'asdfasdf'}
    

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 2022-11-15
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 2012-04-21
      • 2017-07-29
      相关资源
      最近更新 更多