Как добавить URL-адрес пространства имен к представлению маршрутизатора django-rest-framework

Я хотел бы добавить пространство имен 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 быть. Спасибо!

Ответ 2

Это очень старый вопрос, и в настоящее время принятый ответ от Карлтона Гибсона - это всего лишь ссылка на пул-запрос на 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'
    )