【问题标题】:Django-tastypie multiple urls in prepend_urlsDjango-tastypie prepend_urls 中的多个 url
【发布时间】:2013-11-07 11:40:52
【问题描述】:

我正在尝试通过 Django-tastypie 中的prepend_urls() 功能添加访问同一 ResourceModel 的两种不同方法,但第二个 url 永远不起作用。

这是我的代码:

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 的有用资源。我错过了一些琐碎的事情吗?

【问题讨论】:

    标签: python django api tastypie


    【解决方案1】:

    感谢 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"),
            ]
    

    【讨论】:

    • 如果name等于“123”怎么办?
    【解决方案2】:

    您的 2 个正则表达式匹配相同的输入 url,因为它们是按顺序处理的,第二个永远不会匹配。 您可能希望使用中间 url 片段来区分 2,例如

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

    第二次

    【讨论】:

    • 是否可以避免这样做?理想情况下,我希望 URI 架构类似于 /resource/{ID}//resource/{NAME}/
    • 除非我能做出第一个喜欢 r"^(?P%s)/(?P\d+)/$"
    • 然后,使用单个视图并通过视图代码中的 db 查询来区分 name 和 id。无论如何,在 url 级别,django 无法发挥作用,因此您当前的行为。
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2013-11-21
    • 2013-08-08
    • 2016-06-24
    • 2012-10-15
    • 1970-01-01
    • 2014-02-15
    • 2011-10-15
    相关资源
    最近更新 更多