2014-02-21 30 views
1

我正在覆蓋get_obj_list函數。在一些參數和一個隨機函數之後,我想返回一個跟隨參數的實際對象相關的對象。這工作正常。我怎樣才能返回這個obj而不是一個入口列表?有沒有更適合我的目的的功能?Tastypie API只返回給定參數的一個對象

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: ... 

回答

2

由於方法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'} 
相關問題