У меня есть несколько повторяющихся кодов в моих объявлениях REST, поэтому я решил внедрить @detail_route
методы вместо того, чтобы повторно объявлять их снова и снова.
Однако между версией 3.7.7 drf и версией3.8.2, что-то (ну, функции генерации URL, вот что) изменилось, и эти динамически добавленные подробные маршруты больше не регистрируются в маршрутизаторе / отображаются в URL.
Мой код:
class SiteTreeViewSet(viewsets.ReadOnlyModelViewSet):
.....
def generic_model_rest(model_, field, serfield):
@detail_route()
def _f(self, request, pk=None):
itm = SiteTree.objects.get(pk=int(pk))
serializer = globals()['Settings' + serfield + 'Serializer']
if serfield in ('WWW', 'Oth',):
data = serializer(getattr(itm, 'get_sett_' + serfield.lower())(), many=True)
else:
data = serializer(getattr(itm, 'get_sett_' + serfield.lower())())
return Response(data.data)
setattr(SiteTreeViewSet, 'settings_%s' % serfield.lower(), _f)
generic_model_rest(SettingsApartment, 'apartment', 'Apt')
generic_model_rest(SettingsSwitch, 'switch', 'Swt')
generic_model_rest(SettingsWeblinks, 'weblinks', 'WWW')
generic_model_rest(SettingsWeblinks, 'weblinks1', 'WW1')
generic_model_rest(SettingsOther, 'other', 'Oth')
router.register(r'rest/sitetree', SiteTreeViewSet, 'SiteTree')
Есть ли у меня какие-либо другие варианты "ручной" вставки подробных маршрутов?