如何在django-rest-framework中使用查询参数进行详情视图查找?

2 投票
1 回答
1353 浏览
提问于 2025-04-18 15:47

我有一个 Model,结构大概是这样的:

class Bid(models.Model):
    user = models.ForeignKey(User)
    url = models.URLField()
    ask = models.DecimalField(max_digits=6, decimal_places=2)
    offer = models.DecimalField(max_digits=6, decimal_places=2)

我想用 ModelViewSet 来通过 url 字段查找一个具体的对象。所以我在我的 ModelViewSet 中加了 lookup_url_kwarg = 'url'

class BidViewSet(viewsets.ModelViewSet):
    model = Bid
    serializer_class = BidSerializer
    lookup_url_kwarg = 'url'

我在用 DefaultRouter

router = routers.DefaultRouter()
router.register(r'bids', views.BidViewSet)

但是

GET /bids/?url={url}

这并没有奏效。请求总是被路由到 list 方法。 :(

我尝试了一个自定义的路由器:

class BidRouter(routers.SimpleRouter):
    """ Custom Router to allow /bids/?url= for detail view """
    def __init__(self, trailing_slash=True):
        self.routes.append(routers.Route(
            url=r'^{prefix}/?url={lookup}{trailing_slash}$',
            mapping={
                'get': 'retrieve',
                'put': 'update',
                'patch': 'partial_update',
                'delete': 'destroy'
            },
            name='{basename}-query-detail',
            initkwargs={'suffix': 'Instance'}
        ))
        super(BidRouter, self).__init__(trailing_slash=trailing_slash)

bid_router = BidRouter()
bid_router.register(r'bids', views.BidViewSet)

但它仍然把请求路由到 list 方法。

那么,我该如何使用查询参数来查找详细信息呢?

1 个回答

0

根据django-rest-framework的文档,我觉得你应该使用lookup_field,而不是lookup_url_kwarg。你的绑定应该是:

GET /bids/{url}

撰写回答