Django REST框架URL链接 - 无法解析超链接关系的URL

时间:2018-03-19 01:32:16

标签: django django-rest-framework

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,可以点击并获取实例详细信息:

enter image description here

enter image description here

尝试使用我在下面定义的非常简单的模型来复制它会导致错误地失败:

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   "作者细节&#34 ;.您可能未能在其中包含相关模型   您的API,或者lookup_field属性配置不正确   这个领域。

如果有人可以解释我的示例模型需要做什么以及为什么要做,那就是授予。我确实阅读了HyperLinkedModels等,但无法实现这一点。我很确定我错过了一些愚蠢的工作。

1 个答案:

答案 0 :(得分:1)

非常感谢@Hai Lang。

我设法让它在下面工作。 原始问题是基于我的真实应用程序中的附加组件。今天在使用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条目。无论出于何种原因,它都没有提前工作。

再次感谢Hai Lang提供的帮助。