Django rest framework DRF如何返回使用自定义路由器和modelviewset进行查找筛选的列表

Django rest framework DRF如何返回使用自定义路由器和modelviewset进行查找筛选的列表,django-rest-framework,Django Rest Framework,我试图尽可能多地寻找答案,但我仍然不知道如何在这里实现我的目标 我的目标是: 我需要两个api端点,一个返回由查找字段过滤的列表,另一个返回由另一个字段过滤的obj,两者都使用GET方法。例如: /api/books/bycategory/{category\u lookup}/此端点将返回按类别筛选的书籍列表 /api/books/byid/{id\u lookup}/此返回一本与指定id(非pk)匹配的书 因为这里没有适合我需要的内置路由器,因为内置路由器不提供url模式和返回列表的查找,所

我试图尽可能多地寻找答案,但我仍然不知道如何在这里实现我的目标

我的目标是: 我需要两个api端点,一个返回由查找字段过滤的列表,另一个返回由另一个字段过滤的obj,两者都使用GET方法。例如:

/api/books/bycategory/{category\u lookup}/
此端点将返回按类别筛选的书籍列表

/api/books/byid/{id\u lookup}/
此返回一本与指定id(非pk)匹配的书

因为这里没有适合我需要的内置路由器,因为内置路由器不提供url模式和返回列表的查找,所以我想我需要有一个自己的自定义路由器,所以我有:

类自定义路由器(routers.SimpleRouter):
路线=[
炸药(
url=r'^{prefix}/{url\u path}/{lookup}{training\u slash}$',
name='{basename}-{url\u name}',
细节=正确,
initkwargs={}
)
]
路由器=自定义路由器()
router.register('books',BookViewSet)
和我的序列化程序:

class BookSerializer(serializers.ModelSerializer):
类元:
模型=簿记员
字段='\uuuu所有\uuuu'
就在这里,我认为我走在正确的轨道上,但当谈到风景时,我不太明白。现在我只有这个不完整的视图集:

class BookViewSet(ViewSet.ReadOnlyModelViewSet):
queryset=BookKeeper.objects.all()
serializer_class=图书序列化程序
@动作(细节=真)
按类别(自身、请求)定义:
查找\字段='类别'
@动作(细节=真)
def byid(自我,请求):
查找\u字段='id'
我这里的第一个问题是,我“认为”路由器url中的
{url\u path}
与viewset中指定的
@action
方法名称匹配,并且它们是如何连接的,对吗

第二个问题是如何在视图中使用{lookup}值

第三,如果我要像这样使用,
lookup\u字段是什么

def按类别(自身、请求):
返回响应(BookKeeper.objects.filter(category=))
最后,我的视图集应该是什么样的

如有任何意见,将不胜感激

第二个问题是如何在视图中使用{lookup}值

同一集合需要两个查找字段。您可以通过自定义Mixin类来实现这一点。但在四种情况下,最好不要使用路由器,而是使用自定义URL,因此请按如下方式编辑:

#views.py
类BookViewSet(viewsets.ReadOnlyModelViewSet):
queryset=BookKeeper.objects.all()
serializer_class=图书序列化程序
@动作(细节=真)
按类别(自身、请求、类别)定义:
#按类别进行筛选
印刷品(类别)
@动作(细节=真)
def byid(自我、请求、图书id):
#是否按图书id进行过滤
打印(图书id)
#url.py
get_by_id=views.BookViewSet.as_视图(
{
“get”:“byid”
}
)
按\类别获取\视图=views.BookViewSet.as\视图(
{
“获取”:“按类别”
}
)
URL模式+=[
网址(
r'^api/books/byid/(?P[0-9a-f-]+)/,
通过身份证获取信息,
name='get-by-id'
),网址(
r'^api/books/bycategory/(?P[0-9a-f-]+)/,
按类别获取,
name='get-by-category'
)
]
第二个问题是如何在视图中使用{lookup}值

同一集合需要两个查找字段。您可以通过自定义Mixin类来实现这一点。但在四种情况下,最好不要使用路由器,而是使用自定义URL,因此请按如下方式编辑:

#views.py
类BookViewSet(viewsets.ReadOnlyModelViewSet):
queryset=BookKeeper.objects.all()
serializer_class=图书序列化程序
@动作(细节=真)
按类别(自身、请求、类别)定义:
#按类别进行筛选
印刷品(类别)
@动作(细节=真)
def byid(自我、请求、图书id):
#是否按图书id进行过滤
打印(图书id)
#url.py
get_by_id=views.BookViewSet.as_视图(
{
“get”:“byid”
}
)
按\类别获取\视图=views.BookViewSet.as\视图(
{
“获取”:“按类别”
}
)
URL模式+=[
网址(
r'^api/books/byid/(?P[0-9a-f-]+)/,
通过身份证获取信息,
name='get-by-id'
),网址(
r'^api/books/bycategory/(?P[0-9a-f-]+)/,
按类别获取,
name='get-by-category'
)
]

感谢您的帮助,我想使用路由器,因为我的其他型号也需要类似的端点,因此需要添加许多url,并且模式基本相同。关于这种情况,也有类似的问题。检查答案:感谢您的帮助,我想使用路由器,因为我的其他型号也需要类似的端点,因此将有许多url需要添加,并且模式基本相同。关于这种情况,有一个类似的问题。检查答案: