首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用视图名称“图书详细信息”解析超链接关系的URL。

无法使用视图名称“图书详细信息”解析超链接关系的URL。
EN

Stack Overflow用户
提问于 2020-10-10 05:16:41
回答 1查看 491关注 0票数 2

以前我使用的是ModelSerializer,没有错误。当我用HyperlinkedModelSerializer替换它时,这个错误被抛出

代码语言:javascript
复制
Could not resolve URL for hyperlinked relationship using view name "book
detail". You may have failed to include the related model in your API,
or incorrectly configured the `lookup_field` attribute on this field.

这是serializers.py文件:

代码语言:javascript
复制
class BookSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Book
        fields = ['id', 'url', 'title', 'subtitle', 'isbn']

model.py

代码语言:javascript
复制
class Book(models.Model):
    title = models.CharField(max_length=250)
    subtitle = models.CharField(max_length=250)
    author = models.CharField(max_length=100)
    isbn = models.CharField(max_length=13)

    def __str__(self):
        return self.title

views.py

代码语言:javascript
复制
class BookListView(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

urls.py

代码语言:javascript
复制
router = routers.DefaultRouter()
router.register('books', BookListView)


app_name = "books"
urlpatterns = [
    path('', include(router.urls)),
]

视图名称book-detail在我的视图中不存在,可能Django是自动创建的,我不知道在哪里找到和调试它?谢谢。

这是错误的回溯-

代码语言:javascript
复制
Environment:


Request Method: GET
Request URL: http://localhost:8000/books/

Django Version: 3.1.2
Python Version: 3.8.5
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'rest_framework',
 'books.apps.BooksConfig']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\relations.py", line 398, in to_representation
    url = self.get_url(value, self.view_name, request, format)
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\relations.py", line 336, in get_url
    return self.reverse(view_name, kwargs=kwargs, request=request, format=format)
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\reverse.py", line 47, in reverse
    url = _reverse(viewname, args, kwargs, request, format, **extra)
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\reverse.py", line 60, in _reverse
    url = django_reverse(viewname, args=args, kwargs=kwargs, **extra)
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\django\urls\base.py", line 87, in reverse
    return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\django\urls\resolvers.py", line 685, in _reverse_with_prefix
    raise NoReverseMatch(msg)

During handling of the above exception (Reverse for 'book-detail' not found. 'book-detail' is not a valid view function or pattern name.), another exception occurred:
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\viewsets.py", line 125, in view
    return self.dispatch(request, *args, **kwargs)
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
    raise exc
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\mixins.py", line 46, in list
    return Response(serializer.data)
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\serializers.py", line 745, in data
    ret = super().data
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\serializers.py", line 246, in data
    self._data = self.to_representation(self.instance)
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\serializers.py", line 663, in to_representation
    return [
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\serializers.py", line 664, in <listcomp>
    self.child.to_representation(item) for item in iterable
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\serializers.py", line 515, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "D:\All\Back-end Django\REST API Django\lib\site-packages\rest_framework\relations.py", line 413, in to_representation
    raise ImproperlyConfigured(msg % self.view_name)

Exception Type: ImproperlyConfigured at /books/
Exception Value: Could not resolve URL for hyperlinked relationship using view name "book-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-10 10:46:44

我也曾面临过这个问题,但我通过这样做解决了问题:

urls.py (项目)

您可能需要在根urls.py中为应用程序提供命名空间。

代码语言:javascript
复制
path('your_url', include(('your_app.urls', 'your_app'), namespace="your_app"))

serializers.py

添加一个HyperlinkedIdentityField

代码语言:javascript
复制
class BookSerializer(serializers.HyperlinkedModelSerializer):
    # add this 
    url = serializers.HyperlinkedIdentityField(view_name="your_app:book-detail")

    class Meta:
        model = Book
        fields = ['id', 'url', 'title', 'subtitle', 'isbn']

urls.py (app)

添加basename

代码语言:javascript
复制
router = routers.DefaultRouter()
# add basename
router.register('books', BookListView, basename="books")

Docs https://www.django-rest-framework.org/tutorial/5-relationships-and-hyperlinked-apis/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64290220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档