【问题标题】:I am following a Django REST API tutorial. However, getting error? (Topic: serializers.HyperlinkedModelSerializer)我正在关注 Django REST API 教程。但是,得到错误? (主题:serializers.HyperlinkedModelSerializer)
【发布时间】:2021-10-17 08:59:31
【问题描述】:

/watch/stream/ 配置不正确 无法使用视图名称“streamplatform-detail”解析超链接关系的 URL。您可能未能在 API 中包含相关模型,或者在此字段上错误地配置了 lookup_field 属性。

在访问 URL(127.0.0.1:8000/watch/stream/) 时出现上述错误

Models.py

from django.db import models

class StreamPlatform(models.Model):
    name = models.CharField(max_length=30)
    about = models.CharField(max_length=150)
    website = models.URLField(max_length=100)

    def __str__(self):
        return self.name

class WatchList(models.Model):
    title = models.CharField(max_length=50)
    storyline = models.CharField(max_length=200)
    platform = models.ForeignKey(StreamPlatform, on_delete=models.CASCADE, related_name="watchlist")
    active = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

urls.py

from django.urls import path, include
from watchlist_app.api.views import WatchListAV, WatchDetailAV, StreamPlatformAV, StreamDetailAV

urlpatterns = [
    path('list/', WatchListAV.as_view(), name='movie-list'),
    path('<int:pk>/', WatchDetailAV.as_view(), name='movie-details'),
    path('stream/', StreamPlatformAV.as_view(), name='stream-list'),
    path('stream/<int:pk>/', StreamDetailAV.as_view(), name='stream-details'),
]

views.py

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from watchlist_app.models import WatchList, StreamPlatform
from watchlist_app.api.serializers import WatchListSerializer, StreamPlatformSerializer


class StreamPlatformAV(APIView):

    def get(self, request):
        platform = StreamPlatform.objects.all()
        Serializer = StreamPlatformSerializer(platform, many=True, context={'request': request})
        return Response(Serializer.data)

    def post(self, request):
        serializer = StreamPlatformSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors)


class StreamDetailAV(APIView):

    def get(self, request, pk):
        try:
            platform = StreamPlatform.objects.get(pk=pk)
        except StreamPlatform.DoesNotExist:
            return Response({'error': 'Not found'}, status=status.HTTP_404_NOT_FOUND)

        serializer = StreamPlatformSerializer(platform)
        return Response(serializer.data)

    def put(self, request, pk):
        platform = StreamPlatform.objects.get(pk=pk)
        serializer = StreamPlatformSerializer(platform, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk):
        platform = WatchList.objects.get(pk=pk)
        platform.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)


class WatchListAV(APIView):

    def get(self, request):
        movies = WatchList.objects.all()
        Serializer = WatchListSerializer(movies, many=True)
        return Response(Serializer.data)

    def post(self, request):
        serializer = WatchListSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors)


class WatchDetailAV(APIView):

    def get(self, request, pk):
        try:
            movie = WatchList.objects.get(pk=pk)
        except WatchList.DoesNotExist:
            return Response({'error': 'Not found'}, status=status.HTTP_404_NOT_FOUND)

        serializer = WatchListSerializer(movie)
        return Response(serializer.data)

    def put(self, request, pk):
        movie = WatchList.objects.get(pk=pk)
        serializer = WatchListSerializer(movie, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk):
        movie = WatchList.objects.get(pk=pk)
        movie.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

serializer.py

from rest_framework import serializers
from watchlist_app.models import WatchList, StreamPlatform


class WatchListSerializer(serializers.ModelSerializer):

    class Meta:
        model = WatchList
        fields = "__all__"
        

class StreamPlatformSerializer(serializers.HyperlinkedModelSerializer):

    watchlist = WatchListSerializer(many=True, read_only=True)

    class Meta:
        model = StreamPlatform
        fields = "__all__"

【问题讨论】:

    标签: python django api django-rest-framework


    【解决方案1】:

    通过将您的 urls.py 中的 name='stream-details' 更改为 name="stream platform-detail" 必须解决问题。

     path('stream/<int:pk>', StreamDetailAV.as_view(), name="streamplatform-detail")
    

    希望对你有帮助

    【讨论】:

    • 这个“path('stream/', StreamDetailAV.as_view(), name="streamplatform-detail")”工作了!....但是怎么样?
    【解决方案2】:

    第 1 步。

        path('', include('testapp.api.urls', namespace="testapp")),
    

    第 2 步。 添加应用程序文件夹中的 urls.py 文件。

        app_name = 'testapp'
    

    第 3 步。

     class StreamPlatformSerializer(serializers.HyperlinkedModelSerializer):
            watchlist_platform = WatchListSerializer(many=True, read_only=True)
            url = serializers.HyperlinkedIdentityField(view_name="testapp:stream-detail")
    

    第四步

           serializer = StreamPlatformSerializer(platform, many=True, context={'request': request})
    

    它解决了我的问题。

    【讨论】:

      猜你喜欢
      • 2011-02-18
      • 2019-05-13
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      相关资源
      最近更新 更多