2013-11-07 3 views
1

Я пытаюсь добавить два разных метода доступа к той же ResourceModel через функциональность prepend_urls() в Django-tastypie, но второй URL никогда не работает.Django-tastypie множественные urls в prepend_urls

Вот код, у меня есть:

class UserResource(ModelResource): 
    class Meta: 
     ... 
     my_id_uri_name = 'my_id' 
     name_uri_name = 'name' 

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

Я не могу найти какие-либо полезные ресурсы о добавлении дополнительного URL здесь. Я пропустил что-то тривиальное?

ответ

2

Я решил эту проблему, благодаря предложению Zeograd по поводу регулярных выражений.

Я изменил первый {ID} выражение в соответствии с целым числом, а второй по нитке, как так:

def prepend_urls(self): 
     return [ 
      url(
       r"^(?P<resource_name>%s)/(?P<my_id>\d+)/$" 
       % self._meta.resource_name, self.wrap_view('dispatch_detail'), 
       name="api_dispatch_detail_id"), 
      url(
       r"^(?P<resource_name>%s)/(?P<name>[\w\d_.-]+)/$" 
       % self._meta.resource_name, self.wrap_view('dispatch_detail'), 
       name="api_dispatch_detail_name"), 
     ] 
+1

Что делать, если имя равно «123»? –

0

ваше 2 регулярное выражение соответствует одному URL-адресу ввода, так как они обрабатываются в порядке, второй никогда не совпадает. Вы можете использовать промежуточный фрагмент URL-адрес, чтобы отличать 2, как

r"^(?P<resource_name>%s)/by-name/(?P<name>[\w\d_.-]+)/$" 

для второго

+0

Можно ли избежать этого? В идеале я хочу, чтобы схема URI была как _/resource/{ID}/_ и _/resource/{NAME}/_ – phalt

+0

Если я не могу сделать первый, например, r "^ (? P <имя_ресурса>% s)/(? P \ d +)/$ " – phalt

+0

Затем используйте один вид и различайте между именем и идентификатором через db-запросы внутри кода представления. В любом случае, на уровне url, django не способен внести изменения, следовательно, ваше текущее поведение. – Zeograd

Смежные вопросы