如何让Django Rest Framework中的HyperlinkedModelSerializer适用于foreignkeys?

lac*_*lac 1 django django-rest-framework

我是Django Rest Framework的新手,我正在努力使我的序列化能够正常工作以获得两个模型之间的外键关系.我试图减少我的设置尽可能简单,但我仍然无法理解它应该如何工作.我试图使用HyperlinkedModelSerializer(来自文档)'它使用超链接来表示关系'.当我尝试访问测试服务器上{model X}的列表或详细视图的url时,我得到:

'无法使用视图名称"{model Y} -detail"解析超链接关系的URL.您可能未能在API中包含相关模型,或者lookup_field在此字段上错误地配置了该属性.

我究竟做错了什么?

我的模特:

from django.db import models


class Project(models.Model):
    name = models.CharField(max_length=50)
    description = models.TextField()


class ProjectPhoto(models.Model):
    project = models.ForeignKey(
            Project, related_name='photos', on_delete=models.CASCADE
        )
    image = models.ImageField()
    caption = models.CharField(max_length=100)
    date_added = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

我的序列化器

class ProjectSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Project
        fields = ('name', 'description', 'photos')


class ProjectPhotoSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = ProjectPhoto
        fields = ('image', 'caption', 'date_added', 'project'))
Run Code Online (Sandbox Code Playgroud)

我的观点:

from rest_framework import viewsets

from projects.models import Project, ProjectPhoto
from projects.serializers import ProjectSerializer, ProjectPhotoSerializer


class ProjectViewSet(viewsets.ModelViewSet):
    queryset = Project.objects.all().order_by('name')
    serializer_class = ProjectSerializer


class ProjectPhotoViewSet(viewsets.ModelViewSet):
    queryset = ProjectPhoto.objects.all().order_by('date_added')
    serializer_class = ProjectPhotoSerializer
Run Code Online (Sandbox Code Playgroud)

编辑:

我的网址:

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

from projects import views


router = routers.DefaultRouter()
router.register(r'^projects', views.ProjectViewSet)
router.register(r'^project-photos', views.ProjectPhotoViewSet)

urlpatterns = [
        url(r'^', include(router.urls)),
    ]
Run Code Online (Sandbox Code Playgroud)

然后将这些添加到我的主应用程序urls.py文件中.我不认为这是问题,好像我改变序列化器,ModelSerializer然后一切正常.

Rob*_*lís 5

我认为你的问题在你的urls.py文件中,请参阅代码和图片

rest/urls.py文件

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

from .views import ProjectViewSet, ProjectPhotoViewSet

router = routers.SimpleRouter()
router.register(r'project', ProjectViewSet)
router.register(r'project-photo', ProjectPhotoViewSet)

urlpatterns = [
  url(r'^', include(router.urls)),
]
Run Code Online (Sandbox Code Playgroud)

Principal urls.py文件:

from django.conf.urls import url, include
from django.contrib import admin

from rest import urls as urls_rest

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^rest/', include(urls_rest)),
]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

和其他选项,尝试在serializers.py文件中使用此代码:

from rest_framework import serializers


from .models import Project, ProjectPhoto


class ProjectPhotoSerializer(serializers.ModelSerializer):

  class Meta:
    model = ProjectPhoto
    fields = ('image', 'caption', 'date_added', 'project')


class ProjectSerializer(serializers.ModelSerializer):

  class Meta:
    model = Project
    fields = ('name', 'description', 'photos')
    depth = 2
Run Code Online (Sandbox Code Playgroud)

您有3个选项可以使用序列化器(见下图) 在此输入图像描述

  • 非常感谢,我删除了`^`s,它可以工作。你能解释为什么它以前与 `ModelSerializer` 一起工作而不是与 `HyperlinkedModelSerializer` 一起工作吗? (3认同)