Шаблоны вложенных URL-адресов в Django REST Framework

Я пытаюсь выйти за рамки исходных плоских шаблонов URL-адресов Django REST Frameworks. Например, если у меня есть типы объектов parentobject и childobject, где parentobject имеет дочерний объект(ы), то стандартный REST выглядит следующим образом.

^ ^api/ ^ ^parentobject/$ [name='parentobject-list']
^ ^api/ ^ ^parentobject/\.(?P<format>[a-z]+)$ [name='parentobject-list']
^ ^api/ ^ ^parentobject/(?P<pk>[^/]+)/$ [name='parentobject-detail']
^ ^api/ ^ ^parentobject/(?P<pk>[^/]+)/\.(?P<format>[a-z]+)$ [name='parentobject-detail']
^ ^api/ ^ ^childobject/$ [name='childobject-list']
^ ^api/ ^ ^childobject/\.(?P<format>[a-z]+)$ [name='childobject-list']
^ ^api/ ^ ^childobject/(?P<pk>[^/]+)/$ [name='childobject-detail']
^ ^api/ ^ ^childobject/(?P<pk>[^/]+)/\.(?P<format>[a-z]+)$ [name='childobject-detail']

В ответах родительского объекта будут ссылки на идентификатор дочернего объекта (ов).

GET /api/parentobject/1/

(results in)
{
    "childobject": [123, 456, 789]
}

Если вам нужны подробности о дочернем объекте (или обо всех дочерних объектах в базе данных), вы можете сослаться на API дочернего объекта.

/api/childobject/
/api/childobject/123/

На той же странице все еще? :)

Что я хочу сделать, так это создать общий/расширяемый способ ссылки на дочерние отношения m2m через API родительского объекта без необходимости вытягивать идентификаторы, а затем повторно запрашивать API дочернего объекта.

/api/parentobject/1/childobject/

[
    {
        "childobject_prop": 1
        ...etc
    }
]

Таким образом, приведенное выше будет дочерним объектом (ами), отфильтрованным на основе ссылки на родительский объект в таблице m2m through, управляемой Django.

Идея также заключалась в том, что это будет общим до такой степени, что я смогу определить новое сквозное отношение и иметь эту возможность с минимальными усилиями. например шаблоны URL будут автоматически и т. д.

Кроме того, любые нисходящие отношения будут обрабатываться таким же образом. Так что "someotherchildobject" ниже возвращает список someotherchildobject(s), которые сопоставлены с дочерним объектом '123', которые сопоставлены с родительским объектом '1'.

/api/parentobject/1/childobject/123/someotherchildobject/

Если это недостаточно ясно, дайте мне знать. Мой успех до сих пор был ограничен. Я не хочу модифицировать Django REST для этого, и в то же время я не хочу создавать шаблоны URL-адресов «вручную», добавляя конкретные, которые меня интересуют, в шаблоны URL-адресов.

Кроме того, в качестве бонуса я хочу, чтобы это применялось к таблицам CUSTOM through= в Django; и сопоставьте любые дополнительные поля сквозной таблицы с полями в возвращаемых данных подобно этому .

Спасибо!


person chris.guethle    schedule 20.06.2013    source источник


Ответы (2)


Вам следует исследовать https://github.com/alanjds/drf-nested-routers/

Это было предложено в https://github.com/tomchristie/django-rest-framework/pull/1048

person Thomas Grainger    schedule 14.11.2013

drf-extensions также предоставляют вложенные маршруты. Посмотрите http://chibisov.github.io/drf-extensions/docs/#nested-routes

person ayarshabeer    schedule 14.01.2015