1

ModelResource の一部に「一般的な」検索を追加する方法を探しています。「v1」API を使用して、この種の URL ですでに登録されている ModelResources の一部を照会できるようにしたいと考えています: /api/v1/?q='blabla'。次に、クエリ内に入力できる ModelResourceS の一部を回復したいと思います。

どのアプローチが最善だと思いますか?

行データを表す独自のクラスを使用して GenericResource(Resource) を構築しようとしましたが、成功しませんでした。私を助けるためのリンクがいくつかありますか?

よろしく、

4

1 に答える 1

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)
于 2013-05-17T22:18:44.503 に答える