【问题标题】:Reverse URL by more than one parameter in Django REST Framework在 Django REST Framework 中通过多个参数反向 URL
【发布时间】:2014-10-31 17:02:38
【问题描述】:

让我们采用通常的Customers 和Orders 对模型。

我们如何使HyperlinkedModelSerializerOrder url 字段反向到像/customers/<customer_pk>/orders/<order_id>/ 这样的网址?

我曾想过在Meta 类中使用lookup_field,但它似乎只接受一个字段。

感谢您的帮助

【问题讨论】:

  • Artur - 如果你解决了这个问题,我很感兴趣?你能发布你自己的解决方案吗?
  • @jamesc 抱歉,我没有解决这个问题。我终于有了像 /customers//orders/ 这样的列表 URL 和 /orders// 这样的详细信息
  • 没问题阿图尔!昨天我发现了一些解决方法 - 我将其添加为答案。

标签: python django django-rest-framework


【解决方案1】:

HyperlinkedModelSerializer 在 DRF 2.0 中使用 lookup_field 中的单个参数,所以和你一样,我无法使用它。

但是,通过我在 this question 上学到的一些技巧,我能够构建一个 ModelSerializer,它具有一个包含您描述的反向 URL 的 url 字段。

class OrderSerializer(serializers.ModelSerializer):
    # Fields, etc
    url = serializers.SerializerMethodField('make_url')

    class Meta:
        model = Order
        # Class info here as usual

    def make_url(self, obj):
        """
        Build URL for Order instance
        """
        # Prepare the IDs you need for the URL reverse
        kwargs = {
            'customer_pk': obj.customer.id,
            'order_id': obj.id,
        }
        url = reverse('api:single_order', kwargs=kwargs)
        return self.context['request'].build_absolute_uri(url)

【讨论】:

    【解决方案2】:

    如果您正在使用视图集,那么此库将为您提供帮助:drf-nested-routers

    【讨论】:

    • 感谢您的帮助。不幸的是,我没有使用视图集。
    • @ArturSoler 您是否将此 API 端点仅用于读取或其他方法?
    • 读取、更新和可能删除
    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 2015-05-11
    • 2018-07-04
    • 2017-01-09
    • 2020-01-10
    • 2018-07-28
    • 1970-01-01
    • 2015-05-03
    相关资源
    最近更新 更多