我需要如何更改我的路径以使用 url 中的多个 ID 但不作为参数?

How I need to change my paths to use multiple ids from url but not as params?

我想要一个这样的URL 127.0.0.1:8000/classesapp/class/1/student/2/statistics/ 所以在 Django class 的后端,我将能够使用这样的 ID 进行原始查询:

select * 
from statistics
inner join students on statistics.student_id = student.id
inner join class on student.student_class_id = class.id
where class.id = 1 and student.id = 2

我怎样才能做到这一点?我不知道我需要做什么。 我试过了,但还是没用。 class/<int:pk>/students/<int:pk>/statistics

我的路径是:

path('class/<int:pk>/', views.ClassesDetailView.as_view(), name="class_detail"),
path('about/', views.AboutView.as_view(), name="about"),
path('class/<int:pk>/', views.ClassesDetailView.as_view(), name="class_detail"),
path('new/', views.ClassesCreateView.as_view(), name="classes_create"),
path('class/<int:pk>/update/', views.ClassesUpdateView.as_view(), name="classes_update"),
path('class/<int:pk>/delete/', views.ClassesDeleteView.as_view(), name="classes_delete"),
path('class/<int:pk>/student/new/', views.StudentsCreateView.as_view(), name="student_create"),
path('students/', views.StudentsListView.as_view(), name="students_list"),
path('student/<int:pk>/', views.StudentsDetailView.as_view(), name="student_detail"),
path('student/<int:pk>/update/', views.StudentsUpdateView.as_view(), name="student_update"),
path('student/<int:pk>/delete/', views.StudentsDeleteView.as_view(), name="student_delete"),
path('student/<int:pk>/statistics/new/', views.StatisticsCreateView.as_view(), name="statistics_create"),
path('statistic/<int:pk>/update/', views.StatisticsUpdateView.as_view(), name="statistic_update"),
path('statistic/<int:pk>/delete/', views.StatisticsDeleteView.as_view(), name="statistic_delete"),

尖括号内的项目描述了url中的参数(参见doc)。第一个是类型,第二个是参数的名称。 在此之后,在您的 url 中,您有两个类型为 'int' 且名称相同的参数 'pk'。您可以将其中一个重命名,例如,第一个重命名为 'class_id':

class/<int:class_id>/students/<int:pk>/statistics    

我建议在基于 class 的视图 (cbv) 中将模型参数保留为 'pk'(在上面的示例中,您的 cbv 中的相关模型将是学生)。在您看来,您现在可以通过

使用变量
self.kwargs['class_id']    

如果你想在你的 python 代码中引用这个 url,你可以使用 (doc)

reverse('name-of-your-url', args=(class_id, student_id,))    

并在您的模板中

{% url 'name-of-your-url' class_id student_id %}