Skip to main content
 首页 » 编程设计

python之在 Django Rest Framework 中接受 URL 或 PK 作为过滤器

2025年05月04日24lori

我正在将 Django Rest Framework 升级到当前版本。有了新的过滤功能,我发现任何外键字段都需要很长时间才能加载初始页面,如果有多个外键字段(我在下面使用的示例是 event 是Ticket 模型上的 FK)。也就是说,我正在使用 filter_class 并在 Meta 字段列表中传递 FK:

# my viewset 
class TicketViewSet(ModelViewSet): 
    queryset = Ticket.objects.all() 
    filter_class = api_filters.TicketFilterSet 
 
 
#my filterset 
class TicketFilterSet(FilterSet): 
    event = django_filters.NumberFilter(name="event") 
 
    class Meta: 
        model = Ticket 
        fields = ["event", ] 

在此示例中,传递这样的 URL 有效: http://website.com/api/tickets/?event=19919

此 URL 不会: http://website.com/api/tickets/?event=http://website.com/api/events/19919/

我希望能够接受任何一个。显然,NumberFilter 仅适用于数字,不适用于 URL——我如何使用可以接受任何一种格式的过滤器?

请您参考如下方法:

您真的应该尝试摆脱前端代码中的第二种形式。对完整 url 参数的任何支持都只是糟糕设计的变通方法,而糟糕的设计会一次又一次地伤害你。

如果那不可能,请重载您的 ViewSet 的 get 或 dispatch(没有我面前的代码,所以无法判断哪个最有效)方法并使用正则表达式从 url 中获取 id 并将其放回 request.GET - 这有点棘手,因为它是只读的,所以你必须克隆它,修改克隆并分配回到请求。