【发布时间】:2018-05-10 14:06:58
【问题描述】:
我的 REST 声明中有一些高度重复的代码,因此我决定注入 @detail_route 方法,而不是一遍又一遍地重新声明它们。
但是,在 drf 3.7.7 版和 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')
我还有其他“手动”插入详细路线的选项吗?
【问题讨论】:
标签: django django-rest-framework python-3.6