我正在将 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 - 这有点棘手,因为它是只读的,所以你必须克隆它,修改克隆并分配回到请求。
