1

私は次のようにAPIを構築しようとしています:

api/v1/<client_slug>/track/expenses

/clientsただし、少なくともこの時点では、返す必要のあるデータが実際にはありません。そのため、REST 標準に従うために ClientResource を作成する必要がないようにしたいと考えていました。以下は、私の ExpenseResource の例です。

class ExpenseResource(ModelResource):
    class Meta:
        resource_name = 'expenses'
        queryset = Expense.objects.all() # Wish to filter by client_slug
        include_resource_uri = False

        authentication = OAuthTokenAuthentication()
        authorization = Authorization() # allow GET/PUT/POST/DELETE/PATCH

    def prepend_urls(self):
        return [
            url(r"^track/(?P<resource_name>%s)/$" % self._meta.resource_name, self.wrap_view('dispatch_list'), name='api_dispatch_list'),
            url(r"^track/(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/$" % self._meta.resource_name, self.wrap_view('dispatch_detail'), name='api_dispatch_detail'),
        ]

client_slugを my に含めるのに最適な方法は何ExpenseResourceですか? 提供されたclient_slugで経費をフィルタリングしたいのですが、どのようにすればよいですか? ありがとうございました!

4

1 に答える 1

3

実際にはかなり単純です。. _ base_urls()_ override_urls()_ prepend_urls()_client_slug

各リソースに対して、Tastypie は次のことを行います。

def base_urls(self):
    """
    The standard URLs this ``Resource`` should respond to.
    """
    # Due to the way Django parses URLs, ``get_multiple`` won't work without
    # a trailing slash.
    return [
        url(r"^(?P<resource_name>%s)%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('dispatch_list'), name="api_dispatch_list"),
        url(r"^(?P<resource_name>%s)/schema%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('get_schema'), name="api_get_schema"),
        url(r"^(?P<resource_name>%s)/set/(?P<pk_list>\w[\w/;-]*)/$" % self._meta.resource_name, self.wrap_view('get_multiple'), name="api_get_multiple"),
        url(r"^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('dispatch_detail'), name="api_dispatch_detail"),
    ]

必要なものは次のとおりです。

    return [
        url(r"^(?P<client_slug>\w+)/(?P<resource_name>%s)%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('dispatch_list'), name="api_dispatch_list"),
        url(r"^(?P<client_slug>\w+)/(?P<resource_name>%s)/schema%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('get_schema'), name="api_get_schema"),
        url(r"^(?P<client_slug>\w+)/(?P<resource_name>%s)/set/(?P<pk_list>\w[\w/;-]*)/$" % self._meta.resource_name, self.wrap_view('get_multiple'), name="api_get_multiple"),
        url(r"^(?P<client_slug>\w+)/(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('dispatch_detail'), name="api_dispatch_detail"),
    ]

言及されたメソッドの1つを使用してそれらを提供するだけで、それを受け入れるTastypieのすべてのメソッドでclient_slug利用できると思います。kwargs[ 'client_slug' ]**kwargs

私はそれをテストしていませんが、与えました:

 objects = self.obj_get_list(request=request, **self.remove_api_resource_names(kwargs))

すぐに使用できるように、クライアントごとに費用をフィルタリングするget_list()ことさえできます。

于 2012-09-05T02:37:23.397 に答える