对于有类似问题的任何人,请查看alanjds/drf-nested-routers。这就是我使用的,并且效果很好。
这是我所做的概述。
使用pip install drf-nested-routers
.
根据文档,
不需要在 Django 项目的 settings.py 文件中添加这个库,因为它不包含任何应用程序、信号或模型。
在我的应用程序urls.py
文件中,我创建了父子路由器
router = routers.SimpleRouter()
router.register(r'boards', views.BoardViewSet, basename="boards_api_list")
boards_router = routers.NestedSimpleRouter(router, r'boards', lookup='board')
boards_router.register(r'jobs', views.JobViewSet, basename='board_jobs_list')
urlpatterns = [
path('api/', include(router.urls)),
path('api/', include(boards_router.urls)),
]
然后在我的 中serializers.py
,我创建了一个HyperlinkedModelSerializer
class BoardSerializer(serializers.HyperlinkedModelSerializer):
owner = UserSerializer()
jobs = NestedHyperlinkedRelatedField(
many=True,
read_only=True,
view_name='jobs_view_name',
parent_lookup_kwargs={'slug': 'board__slug'}
)
class Meta:
model = Board
fields = [...]
extra_kwargs = {
'url': {'view_name': 'my_custom_view_name', 'lookup_field': 'slug'},
...other desired kwargs...
}
class JobViewSet(serializers.ModelSerializer):
...standard serializer settings...
我继续views.py
创建我的视图集并添加了get_queryset
参数
class JobViewSet(viewsets.ModelViewSet):
queryset = Job.objects.all().order_by('-date_posted')
serializer_class = JobSerializer
filter_backends = (DatatablesFilterBackend,)
filterset_class = JobGlobalFilter
def get_queryset(self):
return Job.objects.filter(board__slug=self.kwargs['board_slug'])
完成这些操作后,您应该能够通过以下方式访问您的 API
/parent_url/{{parent_pk}}/child_list/{{child_pk}}
现在,由于我的特殊需求(我想在数据表上使用它来过滤相关对象),我将我的 API 的 URL 添加到我的头部,base.html
以便可以动态加载 URL,因为我无法在我的文件
...
<head>
<script>var boardListUrl= "{% url 'boards:boards_api_list-list' %}?format=datatables"</script>
{% if board.slug %}
<script>var jobListUrl= "{% url 'boards:board_jobs_list-list' board.slug %}?format=datatables"</script>
{% endif %}
<head>
...
在我的main.py
文件中,我做了以下
var table = $('#tableName').DataTable({
...
"ajax": jobListUrl,
...
});