![](/img/trans.png)
[英]Generate url with api_key and slug with Tastypie (Django)
[英]Django Tastypie Override URL with slug
我有類似的感覺:
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
歡迎提供任何其他改進建議。
您可以在資源上覆蓋get_resource_uri
以返回正確的uri。 歸根結底,正確的是那些有the的人,因為那是資源捕獲的(第一個)人。
更新資料
正確的方法實際上是跳過override_urls
並將其放在資源的Meta上:
detail_uri_name = 'slug'
TLDR背景
我挖得更深一些,看來有更好的地方可以實現這一點。 get_resource_uri
的默認實現(間接)調用self.detail_uri_kwargs
然后reverse
。
ModelResource
中detail_uri_kwargs
的默認實現只是查找self._meta.detail_uri_name
(其名稱不直觀),然后從模型中獲取該鍵。 detail_uri_name
默認為pk
。
如果您只是在此處提供其他名稱,則可以跳過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
是否繼承(我想他們不是),所以這可能不能作為基類。 幸運的是,所需的一行可以很好地粘貼到每個需要它的資源中。
即使@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用於列出以及獲取資源。 但是,您很可能會丟失{schema}資源(即/ api / posts / schema /),因為它也被視為一種資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.