Я создаю проект в Django Rest Framework, где пользователи могут войти в систему, чтобы просмотреть свой винный погреб. Мои ModelViewSets работали нормально, и внезапно я получаю эту неприятную ошибку:
Не удалось разрешить URL-адрес для связи с гиперссылкой с использованием имени представления «сведения о пользователе». Возможно, вы не смогли включить связанную модель в свой API или неправильно настроили
lookup_field
атрибут в этом поле.
Трассировка показывает:
[12/Dec/2013 18:35:29] "GET /bottles/ HTTP/1.1" 500 76677
Internal Server Error: /bottles/
Traceback (most recent call last):
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/viewsets.py", line 78, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 57, in wrapped_view
return view_func(*args, **kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/views.py", line 399, in dispatch
response = self.handle_exception(exc)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/views.py", line 396, in dispatch
response = handler(request, *args, **kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/mixins.py", line 96, in list
return Response(serializer.data)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/serializers.py", line 535, in data
self._data = [self.to_native(item) for item in obj]
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/serializers.py", line 325, in to_native
value = field.field_to_native(obj, field_name)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/relations.py", line 153, in field_to_native
return self.to_native(value)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/relations.py", line 452, in to_native
raise Exception(msg % view_name)
Exception: Could not resolve URL for hyperlinked relationship using view
name "user-detail". You may have failed to include the related model in
your API, or incorrectly configured the `lookup_field` attribute on this
field.
У меня есть пользовательская модель электронной почты, а модель бутылки в models.py:
class Bottle(models.Model):
wine = models.ForeignKey(Wine, null=False)
user = models.ForeignKey(User, null=False, related_name='bottles')
Мои сериализаторы:
class BottleSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Bottle
fields = ('url', 'wine', 'user')
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('email', 'first_name', 'last_name', 'password', 'is_superuser')
Мои взгляды:
class BottleViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows bottles to be viewed or edited.
"""
queryset = Bottle.objects.all()
serializer_class = BottleSerializer
class UserViewSet(ListCreateAPIView):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = User.objects.all()
serializer_class = UserSerializer
и, наконец, URL:
router = routers.DefaultRouter()
router.register(r'bottles', views.BottleViewSet, base_name='bottles')
urlpatterns = patterns('',
url(r'^', include(router.urls)),
# ...
У меня нет представления сведений о пользователе, и я не понимаю, откуда могла возникнуть эта проблема. Любые идеи?
Спасибо
Я тоже столкнулся с этой ошибкой и решил ее следующим образом:
Причина в том, что я забыл указать "** - detail" (view_name, например: user-detail) пространство имен. Итак, Django Rest Framework не смог найти это представление.
В моем проекте есть одно приложение, предположим, что мое имя проекта
myproject
, а имя приложенияmyapp
.Есть два файла urls.py, один
myproject/urls.py
и другойmyapp/urls.py
. Я даю приложению пространство именmyproject/urls.py
, например:Я зарегистрировал остальные маршрутизаторы фреймворка
myapp/urls.py
, а затем получил эту ошибку.Мое решение заключалось в том, чтобы явно указать URL-адрес с пространством имен:
И это решило мою проблему.
источник
extra_kwargs = {'url': {'view_name': 'myapp:user-detail'}}
Может быть, кто-то может взглянуть на это: http://www.django-rest-framework.org/api-guide/routers/
При использовании пространства имен с сериализаторами с гиперссылками вам также необходимо убедиться, что любые параметры view_name в сериализаторах правильно отражают пространство имен. Например:
вам нужно будет включить параметр, например,
view_name='api:user-detail'
для полей сериализатора, гиперссылки на представление сведений о пользователе.источник
urls.py
был дважды вложен в мойnewsite
проект: (1)newsite/urls.py
(created by django) (2)polls/urls.py
(3)polls/api/v1/urls.py
............ Я должен упомянуть использование вложенного имениurl = serializers.HyperlinkedIdentityField(view_name="polls:polls_api:user-detail")
Еще одна неприятная ошибка, которая вызывает эту ошибку, - это необязательное определение base_name в вашем urls.py. Например:
Это вызовет указанную выше ошибку. Извлеките это base_name и вернитесь к работающему API. Приведенный ниже код исправит ошибку. Ура!
Однако вы, вероятно, не просто произвольно добавили base_name, вы могли это сделать, потому что вы определили собственный def get_queryset () для View, и поэтому Django требует, чтобы вы добавили base_name. В этом случае вам нужно явно определить url как HyperlinkedIdentityField для рассматриваемого сериализатора. Обратите внимание, что мы определяем это поле HyperlinkedIdentityField НА СЕРИАЛИЗАТОРЕ представления, которое выдает ошибку. Если бы моя ошибка была «Не удалось разрешить URL-адрес для связи с гиперссылкой с использованием имени представления« исследование-деталь ». Возможно, вы не смогли включить связанную модель в свой API или неправильно настроили
lookup_field
атрибут в этом поле». Я мог бы исправить это с помощью следующего кода.Мой ModelViewSet (пользовательский get_queryset - вот почему мне в первую очередь пришлось добавить base_name в router.register ()):
Регистрация моего маршрутизатора для этого ModelViewSet в urls.py:
И ВОТ ГДЕ ДЕНЬГИ! Тогда я мог бы решить это так:
Ага. Вы должны явно определить этот HyperlinkedIdentityField на самом себе, чтобы он работал. И вам необходимо убедиться, что значение,
view_name
определенное в HyperlinkedIdentityField, совпадает с тем, которое вы определилиbase_name
в urls.py с добавленным после него «-detail».источник
<app_name>:studies-detail
. Например, если вызывается мое приложениеtanks
, полный путь будетHyperlinkedIdentityField(view_name="tanks:studies-detail")
. Чтобы понять это, я использовал команду django-exensionsshow_urls
, чтобы увидеть полный маршрут и метку, которую маршрутизатор создавал автоматически.Этот код тоже должен работать.
источник
UserSerializer
должно быть реализовано (оно не готово к импорту), как показано в django-rest-framework.org/api-guide/serializersЯ столкнулся с этой ошибкой после добавления пространства имен к моему URL-адресу
и добавление app_name в мой urls.py
Я решил это, указав NamespaceVersioning для API моей остальной инфраструктуры в settings.py моего проекта.
источник
Сегодня я получил ту же ошибку, и ниже меня спасают изменения.
+ Изменить
кому:
источник
Та же ошибка, но другая причина:
Я определяю настраиваемую модель пользователя, ничего нового в поле:
Это моя функция просмотра:
Поскольку я не сдавался
queryset
напрямуюUserViewSet
, я должен установить этоbase_name
при регистрации этого набора просмотров. Вот где мое сообщение об ошибке вызваноurls.py
файлом:Вам нужно такое
base_name
же, как и название вашей модели -customuser
.источник
Если вы расширяете классы GenericViewSet и ListModelMixin и имеете ту же ошибку при добавлении поля URL- адреса в представление списка, это потому, что вы не определяете подробное представление. Убедитесь, что вы расширяете миксин RetrieveModelMixin :
источник
Похоже, что
HyperlinkedModelSerializer
не согласен с тем, чтобы иметь путьnamespace
. В своем приложении я внес два изменения.В импортированном файле urls
Надеюсь это поможет.
источник
Я столкнулся с той же ошибкой, когда следил за кратким руководством по DRF http://www.django-rest-framework.org/tutorial/quickstart/ а затем пытался перейти к / users. Я уже много раз делал эту настройку без проблем.
Мое решение заключалось не в коде, а в замене базы данных.
Разница между этой установкой и предыдущими установками заключалась в том, что я создал локальную базу данных.
На этот раз я запустил свой
сразу после бега
Вместо точного порядка, указанного в руководстве.
Я подозревал, что что-то неправильно создано в БД. Меня не волновала моя база данных разработчика, поэтому я удалил ее и запустил
./manage.py migrate
команду, создал суперпользователя, просмотрел / users, и ошибка исчезла.Что-то было проблематично с порядком операций, в котором я настроил DRF и db.
Если вы используете sqlite и можете протестировать переход на новую БД, то стоит попробовать, прежде чем анализировать весь свой код.
источник
Бутылка = сериализаторы.PrimaryKeyRelatedField (read_only = True)
read_only позволяет вам представлять поле без необходимости связывать его с другим видом модели.
источник
Я получил эту ошибку в DRF 3.7.7, когда значение слага было пустым (равно "") в базе данных.
источник
Я столкнулся с той же проблемой и решил ее, добавив
generics.RetrieveAPIView
в качестве базового класса свой набор представлений.источник
Я застрял в этой ошибке почти 2 часа:
Неправильно настроен в / api_users / users / 1 / Не удалось разрешить URL-адрес для связи с гиперссылкой с использованием имени представления "users-detail". Возможно, вы не смогли включить связанную модель в свой API или неправильно настроили
lookup_field
атрибут в этом поле.Когда я наконец получил решение, но не понимаю почему, мой код:
но в моих основных URL-адресах это было:
Итак, чтобы наконец решить проблему с удалением пространства имен:
И я наконец решил свою проблему, так что любой может сообщить мне почему, бест.
источник
Если вы опустите поля id и url в сериализаторе, у вас не будет никаких проблем. В любом случае вы можете получить доступ к сообщениям, используя идентификатор, который возвращается в объекте json, что еще больше упрощает реализацию вашего интерфейса.
источник
У меня была такая же проблема, думаю, вам стоит проверить свой
get_absolute_url
входное значение метода объектной модели (** kwargs) title. и используйте точное имя поля в lookup_field
источник