Ответ 1
Здесь запрос на перенос для этого в настоящее время. Пожалуйста, не стесняйтесь присоединяться к обсуждению.
Я хотел бы добавить пространство имен url в свой api-маршрутизатор, но когда я делаю, маршрутизатор все еще ищет URL-адреса без пространства имен:
router = DefaultRouter()
router.register(r'users', UserViewSet)
router.register(r'events', EventViewSet)
router.register(r'comments', CommentViewSet)
urlpatterns = patterns('apiroot.views',
url(r'^', include(router.urls, namespace='api')),
)
Доступный для просмотра api ищет имена url, такие как 'user-list'
и 'user-detail'
, а не 'api:user-list'
, что я хотел бы сделать.
Я предполагаю, что для этого есть легкое исправление (похоже, это довольно стандартная вещь, которую нужно делать), но я не могу найти какое-либо решение в django-rest-framework docs. Если мне не хватает чего-то из документов, пожалуйста, поделитесь ссылкой или если я приближаюсь к этому неправильному (например, "зачем вы это делаете, это плохая практика" или что-то еще), пожалуйста, объясните, почему или что правильный способ управления api urls быть. Спасибо!
Здесь запрос на перенос для этого в настоящее время. Пожалуйста, не стесняйтесь присоединяться к обсуждению.
Это очень старый вопрос, и в настоящее время принятый ответ от Карлтона Гибсона - это всего лишь ссылка на пул-запрос на GitHub.
При поиске в сети для использования маршрутизаторов Django REST Framework с пространством имен он занимает первое место в результатах. Похоже, это единственный вопрос SO на эту тему.
Поскольку нет конкретного ответа с примером кода, здесь я хотел бы добавить свое решение.
Давайте возьмем EventViewSet
из вопроса OP. Для этого набора должны быть класс модели Event
и сериализатор модели EventSerializer
. EventSerializer
может выглядеть так:
class EventSerializer(serializers.HyperlinkedModelSerializer):
# any other fields
class Meta:
model = Event
# anything else
extra_kwargs = {
'url': {'view_name': 'api:event-detail'}
}
Это пример для HyperlinkedModelSerializer
который включает в себя поле url
.
Любые гиперссылочные поля, такие как HyperlinkedIdentityField
или HyperlinkedRelatedField
, которые принимают аргумент view_name
в качестве аргумента, должны передавать правильное имя представления, содержащее пространство имен, либо в объявлении, либо через extra_kwargs
.
Для предполагаемого CommentSerializer
(соответствующего CommentViewSet
) это может выглядеть так:
class EventSerializer(serializers.HyperlinkedModelSerializer):
comments = serializers.HyperlinkedRelatedField(
many=True,
read_only=True,
view_name='api:comment-detail'
)