django rest framework динамические «ручные» объявления @detail_route - PullRequest
0 голосов
/ 10 мая 2018

У меня есть несколько повторяющихся кодов в моих объявлениях 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')

Есть ли у меня какие-либо другие варианты "ручной" вставки подробных маршрутов?

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Отладка, черт возьми, из этого: состав URL был полностью обновлен (читай: изменен) в новой версии. Теперь URL будет составлен непосредственно из имени функции, а не из функции, так как она вставлена ​​в целевой класс ViewSet.

В конечном итоге мне пришлось изменить следующие две вещи:

@action(detail=True, url_path='settings_%s' % serfield.lower())
def _f(self, request, pk=None):
    .....

_f.__name__ = 'settings_%s' % serfield.lower()

Я не думаю, что изменение @action было необходимо, но мне лень проверять.

Мне пришлось добавить параметр url_path в сам декоратор, а затем также установить атрибут __name__ функции. Последнее необходимо, потому что drf использует это для уникальности во внутренних словарях при построении маршрутов. Первый теперь генерируется автоматически во время оформления, а не во время оценки / маршрутизации, как раньше.

0 голосов
/ 13 сентября 2018

В более новой версии DRF нет декораторов detail_route и list_route, которые вы можете попробовать выполнить

from rest_framework.decorators import action
...
...
...


@action(detail=True)
def _f(self, request, pk=None):
    ......

здесь http://www.django -rest-framework.org / api-guide / viewsets /

0 голосов
/ 10 мая 2018

@ detail_route и @list_route теперь устарели в пользу маршрутов действий.рекомендуем понизить или использовать маршруты @action.

подробности см. В патче 3.8.0 http://www.django -rest-framework.org / themes / release-notes /

...