Django Tastypie,如何搜索多个模型资源



我正在寻找一种通过我的一些ModelResource添加'通用'搜索的方法。使用'v1' api,我希望能够查询一些已经注册了这种url的ModelResources:/api/v1/?q='blabla'。然后,我想恢复一些可以在查询中填充的ModelResourceS。

你认为哪种方法是最好的?

我试图建立一个GenericResource(Resource),用我自己的类表示行数据,没有成功。你会有一些链接来帮助我吗?

认为,

对于我们正在创建API的移动应用程序,我们创建了一个类似的"Search"类型资源。基本上,我们商定了一组类型和一些公共字段,我们将在应用程序的搜索提要中显示它们。参见下面的代码实现:

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)

最新更新