Classed Based Views : Почему параметры URL в Django/DRF помещаются в `self.kwargs`, а не в другой атрибут (например, `self.url_params`)?
В процессе работы с Django/Django Rest Framework я заметил несоответствие в том, как параметры URL обрабатываются в class-based-views.
Описание проблемы
В представлениях на основе общих классов я могу получить доступ к параметрам URL двумя разными способами - в зависимости от метода:
- Через позиционные аргументы:
Например, в методе
get
я могу получить доступ к параметрам URL как к позиционным аргументам, переданным непосредственно методу:
#urls.py
path('test/<str:param1>/<int:param2>/', MyView.as_view())
#views.py
class MyView(View):
def get(self, request, param1, param2):
return JsonResponse({'param1': param1, 'param2': param2})
- Через атрибут
self.kwargs
Например, когда я хочу получить доступ к тем же параметрам в методеget_queryset
, я должен использоватьself.kwargs
#views.py
class MyView(ListView):
model = MyModel
def get_queryset(self):
param1 = self.kwargs.get('param1')
param2 = self.kwargs.get('param2')
return MyModel.objects.filter(field1=param1, field2=param2)
Я знаю, что могу получить доступ к параметрам url из kwargs
любого места, но это приводит меня к некоторым вопросам
Мои вопросы:
- Почему Django/DRF не ввели специальный атрибут для параметров URL? Разве не было бы более интуитивно понятным хранить эти параметры в специальном атрибуте, таком как
self.url_params
- есть ли какие-либо конкретные причины, почему предпочтительнее использовать имяself.kwargs
- я понял соглашение, но оно меня немного смущает, у нас есть много других атрибутов, таких как idkself.data
илиself.method
, но у нас нет такого для атрибутов url. - Почему механизм
self.kwargs
не объясняется в документации Django. У меня немного болела голова, когда я пытался понять, почему. Этот механизм кажется крайне важным для работы с представлениями, основанными на классах, но я не смог найти четкого объяснения, почему это так. Вместо этого в документации приводятся только примеры, видимо, ожидая, что разработчики «сделают вывод», что параметры URL хранятся в self.kwargs.
Может ли кто-нибудь пролить свет на то, почему так происходит? Буду признателен за любые соображения или объяснения этого дизайнерского решения.