0

私は似たようなコースを持っています:

def override_urls(self):
    return [
        url(r"^(?P<resource_name>%s)/(?P<slug>[\w\d_.-]+)/$" % self._meta.resource_name, self.wrap_view('dispatch_detail'), name="api_dispatch_detail"),
    ]

これは次のようなURLを生成します:

/api/v1/nodes/<slug>/

self.get_resource_uri(bundle)が返さ/api/v1/nodes/<id>/れ、現在のURLとリソースURIを効果的に比較できないことを除いて、すべて問題ありません。

私は何が間違っているのですか?

解決策:作業コード

ここで提案されたソリューションを実装しました: https ://github.com/ninuxorg/nodeshot/blob/refactoring/nodeshot/core/base/resources.py

改善のための追加のフィードバックは大歓迎です。

4

2 に答える 2

6

リソースをオーバーライドget_resource_uriして、正しいURIを返すことができます。結局のところ、正しいものはスラッグのあるものです。これは、リソースによってキャプチャされた(最初の)ものだからです。

アップデート

これを行う正しい方法は、実際にはこれをスキップoverride_urlsしてリソースのメタに配置することです。

detail_uri_name = 'slug'

TLDRの背景

私はもう少し深く掘り下げましたが、これを実装するのにはるかに良い場所があるようです。get_resource_uri(間接的に)呼び出しself.detail_uri_kwargs、次に。のデフォルトの実装reverse

detail_uri_kwargsinのデフォルトの実装は、 (名前が直感的ではない) ModelResourceルックアップし、モデルからそのキーを取得します。デフォルトは。self._meta.detail_uri_namedetail_uri_namepk

ここで別の名前を指定するだけの場合は、override_urlsとget_resource_uriをスキップできます。

このようなもの(OPによるコメントでリンクされたコードに基づいて構築):

from tastypie.resources import ModelResource
from tastypie.bundle import Bundle

class BaseSlugResource(ModelResource):
    """ Base Model Resource using slug urls """

    class Meta:
        abstract = True
        detail_uri_name = 'slug'

リソースが継承されているかどうかは頭から離れていないのでMeta(継承されていないと推測します)、これは基本クラスとして機能しない可能性があります。幸いなことに、必要な1行は、それを必要とする各リソースに貼り付けるのにおそらく問題ありません。

于 2012-09-20T16:51:15.217 に答える
1

@dokkaebiの答えが(そして部分的に)正しいとマークされていても、実際の例でそれをクリーンアップしたいと思います。唯一欠けている部分は、リストなどのために解決されるURLを追加する必要があることです。

from tastypie.resources import ModelResource
from myapp.models import SomeModel

class BaseSlugResource(ModelResource):
    """ Base Model Resource using slug urls """

    class Meta:
        queryset = SomeModel.objects.all()
        detail_uri_name = 'slug'

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

これにより、リスト用の正しいresource_uriとリソースgetが表示されます。ただし、{schema}リソース(つまり、/ api / posts / schema /)もスラッグとして扱われるため、失われる可能性があります。

于 2013-03-06T15:26:20.767 に答える