2013-05-17 3 views
1

Я ищу способ добавить «общий» поиск через некоторые из моих ModelResource. Используя api 'v1', я хотел бы иметь возможность запрашивать некоторые из моих ModelResources, уже зарегистрированных с этим типом URL:/api/v1 /? Q = 'blabla'. Затем я хотел бы восстановить некоторые из моих ModelResourceS, которые могли бы заполнить запрос.Django Tastypie, как искать через несколько modelresource?

Какой подход, по вашему мнению, является лучшим?

Я попытался построить GenericResource (Resource) с моими собственными данными, передающими данные класса, без успеха. У вас есть некоторые ссылки, чтобы помочь мне?

С уважением,

ответ

5

Для мобильного приложения, которое мы создавали API для мы создали подобный «Поиск» тип ресурса. В основном мы договорились о наборе типов и некоторых общих полей, которые мы покажем в фиде поиска в приложении. См. Приведенный ниже код для реализации:

class SearchObject(object): 
def __init__(self, id=None, name=None, type=None): 
    self.id = id 
    self.name = name 
    self.type = type 


class SearchResource(Resource): 
    id = fields.CharField(attribute='id') 
    name = fields.CharField(attribute='name') 
    type = fields.CharField(attribute='type') 

    class Meta: 
     resource_name = 'search' 
     allowed_methods = ['get'] 
     object_class = SearchObject 
     authorization = ReadOnlyAuthorization() 
     authentication = ApiKeyAuthentication() 
     object_name = "search" 
     include_resource_uri = False 

    def detail_uri_kwargs(self, bundle_or_obj): 
     kwargs = {} 

     if isinstance(bundle_or_obj, Bundle): 
      kwargs['pk'] = bundle_or_obj.obj.id 
     else: 
      kwargs['pk'] = bundle_or_obj['id'] 

     return kwargs 

    def get_object_list(self, bundle, **kwargs): 
     query = bundle.request.GET.get('query', None) 
     if not query: 
      raise BadRequest("Missing query parameter") 

     #Should use haystack to get a score and make just one query 
     objects_one = ObjectOne.objects.filter(name__icontains=query).order_by('name').all)[:20] 
     objects_two = ObjectTwo.objects.filter(name__icontains=query).order_by('name').all)[:20] 
     objects_three = ObjectThree.objects.filter(name__icontains=query).order_by('name').all)[:20] 

     # Sort the merged list alphabetically and just return the top 20 
     return sorted(chain(objects_one, objects_two, objects_three), key=lambda instance: instance.identifier())[:20] 

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

Почему я получаю синтаксическую ошибку в строке objectOne? Должен ли я делать что-то еще? – Tushant