Сбой метода Reverse() Django Rest Framework

#django #django-models #django-rest-framework #django-forms #django-views

#django #django-модели #django-rest-framework #django-forms #django-просмотры

Вопрос:

Мой основной urls.py находится здесь ahlami -> ахлами -> urls.py

 urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/accounts/', include('accounts.api.urls')),
]
  

Приложение «Мои учетные записи» urls.py находится здесь ahlami -> учетные записи -> api -> urls.py

 urlpatterns = [
    path('users/<int:pk>/', views.UserView.as_view(), name='user-detail')
]
  

Одна из моих учетных записей views.py возвращает

 token = Token.objects.create(......)
return Response(data=AnonymousUserTokenResponseSerializer(instance=token).data)
  

Моя модель токена содержит только три поля. Для простоты я перечислил одно поле ниже

 class Token(rest_framework.authtoken.models.Token):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE
  

AnonymousUserTokenResponseSerializer связан с моделью токена и возвращает три атрибута json

 class AnonymousUserTokenResponseSerializer(serializers.ModelSerializer):
    user_id = serializers.ReadOnlyField(source='user.id')
    user_url = reverse(viewname='user-detail')
    class Meta:
        model = Token
        fields = ('key',
                  'user_id',
                  'user_url')
  

Сбой AnonymousUserTokenResponseSerializer, поскольку он не может идентифицировать reverse()

 user_url = reverse(viewname='user-detail')
  

python manage.py runserver выдает ошибку ниже из-за строки выше

django.core.exceptions.Неправильно сконфигурировано: в включенном URLconf ‘ahlami.urls’, похоже, нет никаких шаблонов. Если вы видите допустимые шаблоны в файле, то проблема, вероятно, вызвана циклическим импортом.

Мои настройки находятся здесь ahlami -> ahlami -> настройки -> base.py и base.py имеет ли это

 ROOT_URLCONF = 'ahlami.urls'
  

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

 {
    "key": "891e388399f2fcae016fe6887107034239041478",
    "user_id": 29,
    "user_url": http://localhost/api/accounts/users/29 
}
  

Как я могу устранить эту ошибку и заставить reverse () работать?

django.core.exceptions.Неправильно сконфигурировано: в включенном URLconf ‘ahlami.urls’, похоже, нет никаких шаблонов. Если вы видите допустимые шаблоны в файле, то проблема, вероятно, вызвана циклическим импортом.

Комментарии:

1. То, что вы поместили user_url в сериализатор, не имеет никакого смысла, поскольку это не поле сериализатора

2. Что вы имеете в виду? Вы имеете в виду, что user_url не является токеном части? идентификатор пользователя также не является частью сериализатора. Я объявил user_id, и это сработало.

3. user_id является полем сериализатора DRF , но user_url не является

Ответ №1:

Использование serializers.HyperlinkedIdentityField

 class AnonymousUserTokenResponseSerializer(serializers.ModelSerializer):
    user_id = serializers.ReadOnlyField(source='user.id')
    user_url = serializers.HyperlinkedIdentityField(
        view_name='user-detail',
        source='user.id',
        lookup_field='pk'
    )

    class Meta:
        model = Token
        fields = ('key', 'user_id', 'user_url')  

Комментарии:

1. Идеально! Это сработало. Спасибо Араккалу… Мне пришлось внести несколько изменений. Мне пришлось передать контекст в метод моего сериализатора return Response(data=AnonymousUserTokenResponseSerializer(instance=token, context={'request': request}).data) , и мне пришлось перейти на сериализаторы. Гиперссылка identityfield на сериализаторы. Hyperlink RelatedField user_url = serializers.HyperlinkedRelatedField( view_name='user-detail', source='user.id', lookup_field='pk', read_only='True' )

2. Просто пытаюсь понять, почему я должен был передать return context={‘request’: запрос}. Если у вас есть какие-либо мысли, не стесняйтесь поделиться ими здесь. В любом случае, я погуглю это.

3. потому что DRF использует объект запроса внутри для создания URL-адреса