【问题标题】:Django REST Framework url link - Could not resolve URL for hyperlinked relationshipDjango REST Framework url 链接 - 无法解析超链接关系的 URL
【发布时间】:2018-08-27 12:26:36
【问题描述】:

Django REST 框架的新手,似乎我缺少一些基础知识。 在这里和网络上来回阅读了数百个问题,但找不到问题所在。

目标是建立良好的链接和易于探索的 REST api(可点击),就像 https://github.com/encode/rest-framework-tutorial 中展示的示例一样。

任何提示都非常受欢迎,因为我很费劲,找不到可行的解决方案。

class GroupManager(models.Manager):
    use_in_migrations = True
    def get_by_natural_key(self, name):
        return self.get(name=name)

class Group(models.Model):
    name = models.CharField(_('name'), max_length=80, unique=True)
    permissions = models.ManyToManyField(
        Permission,
        verbose_name=_('permissions'),
        blank=True,
    )

    objects = GroupManager()

    class Meta:
        verbose_name = _('group')
        verbose_name_plural = _('groups')

    def __str__(self):
        return self.name

    def natural_key(self):
        return (self.name,)


class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ('url', 'name')

class GroupViewSet(viewsets.ModelViewSet):
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

以上结果是非常好的链接 REST api,带有自动生成的 URL,可点击并获取实例详细信息:

试图用我定义如下的非常简单的模型来复制它失败了:

class Author(models.Model):
    name = models.CharField("Authorist", max_length=20)

    def get_by_natural_key(self,name):
        return self.get(name=name)

    def __str__(self):
        return self.name

    def natural_key(self):
        return (self.name,)

class Book(models.Model):
    title = models.CharField("Tytuł",max_length=100)
    autorek = models.ForeignKey(Author,related_name='knicha',on_delete=models.CASCADE)



class AuthorSerializer(serializers.ModelSerializer):
    # id = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='author-detail')
    class Meta:
        model = Author
        # fields = ('__all__')
        fields = ('url','name')
        # depth = 2

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ('__all__')
        depth = 2


class AuthorVS(viewsets.ModelViewSet):
    queryset = Author.objects.all()
    serializer_class = AuthorSerializer

class BookVS(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer


router.register('author',AuthorVS)
router.register('book',BookVS)

产生的错误是:

无法使用视图名称解析超链接关系的 URL “作者详细信息”。您可能未能将相关模型包含在 您的 API,或者错误地配置了 lookup_field 属性 这个字段。

如果有人能解释我的示例模型需要做什么以及为什么需要做,那将是授权。我确实通读了 HyperLinkedModels 等,但无法正常工作。我很确定我错过了一些愚蠢的东西来让它工作。

【问题讨论】:

  • 你的 Django 和 DRF 版本是什么?哪个操作导致错误?
  • 我无法使用 Django 2.0 和 DRF 3.7 重现该错误。我可以得到链接{ "author": "http://localhost:8000/test/author/", "book": "http://localhost:8000/test/book/" }。所有这些都有效:[ { "url": "http://localhost:8000/test/author/1/", "name": "abcd" } ][ { "id": 1, "title": "efg", "autorek": { "id": 1, "name": "abcd" } } ]
  • 我在 Django 2.0.1 和 DRF 3.7.7 我将发布示例代码,这会导致失败,以便任何人轻松导入/测试。我确定我犯了一些愚蠢的错误:(
  • 愚蠢的错误:我也是:)。我们都在学习。您能否描述一下错误前的操作?同时复制所有错误堆栈并放入您的问题中。
  • 我在# id = serializers... 行中找到了author-detail。你为什么把它评论出来?当我取消注释时,我收到的错误与您的不同。您能否用有错误的版本更新您的问题?

标签: django django-rest-framework


【解决方案1】:

非常感谢@海浪。

我已经设法让它在下面工作。 最初的问题是基于我真实应用程序中的附加组件。当今天对使用 django-admin 创建的 vanilla 应用程序进行相同的测试时,它就可以正常工作了。

查看详细信息,我在我的真实应用中配置了导致问题的附加元素。元素是:

在 mainapp/urls.py 中

app_name = 'mainapp_rest'

在项目/urls.py中

in urlpatterns = [
...
    path('api/', include('upload_rest.urls', namespace='api')),

有问题的部分是“namespace='api'。删除它和“app_name”后,它就开始工作了。

models.py

from django.db import models

class Author(models.Model):
    name = models.CharField("Authorist", max_length=20)
    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField("Tytuł",max_length=100)
    autorek = models.ForeignKey(Author,related_name='knicha',on_delete=models.CASCADE)

    def __str__(self):
        return self.title

serializers.py

from rest_framework import serializers
from test1.models import Author, Book

class AuthorSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Author
        fields = ('url','name','knicha')
        depth = 1

class BookSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Book
        fields = ('url','title','autorek')
        depth = 1

views.py

from test1.serializers import AuthorSerializer, BookSerializer
from test1.models import Author, Book
from rest_framework import viewsets

class AuthorVS(viewsets.ModelViewSet):
    queryset = Author.objects.all()
    serializer_class = AuthorSerializer

class BookVS(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

test1/urls.py

from django.conf.urls import url, include
from rest_framework import routers
from rest_framework.schemas import get_schema_view

from test1.views import AuthorVS, BookVS

schema_view = get_schema_view(title='Test API')

router = routers.DefaultRouter()
router.register('author',AuthorVS)
router.register('book',BookVS)


urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^schema/$', schema_view),
]

main/urls.py
    path('api/', include('test1.urls')),

关键是设置HyperlinkedModelSerializerurl 条目。无论出于何种原因,它之前都无法正常工作。

再次感谢海浪提供的帮助。

【讨论】:

    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 2020-07-30
    • 2018-06-29
    • 2015-01-15
    • 2017-06-27
    • 2014-05-19
    • 2013-12-31
    相关资源
    最近更新 更多