Django restful框架“序列化程序字段可能命名不正确”

2024-04-16 15:27:54 发布

您现在位置:Python中文网/ 问答频道 /正文

您好,亲爱的堆栈溢出, 我用restful框架建立了一个Django项目,并使用JSON响应以结构化方式从服务器检索数据

型号.py

class Container(models.Model):     
    created = models.DateTimeField(auto_now_add=True)     
    title = models.CharField(max_length=100, blank=False, default='content')     
    content = models.TextField()      

        class Meta:         
            ordering = ['created']

问题代码:

视图.py

class ContentView(RetrieveAPIView):
    queryset = Container.objects.all()
    serializer_class = ContainerSerializer
    def get_object(self):
        queryset = self.get_queryset()
        serializer = ContainerSerializer(queryset,many=True)
        return JsonResponse(serializer.data , safe=False)

执行时出现以下错误:

AttributeError: Got AttributeError when attempting to get a value for field `title` on serializer `ContainerSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `JsonResponse` instance.
Original exception text was: 'JsonResponse' object has no attribute 'title'.
[21/May/2021 17:27:13] "GET /content/ HTTP/1.1" 500 18789

为了尽可能清楚,我将附加序列化程序的代码:

序列化程序.py

class ContainerSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    title = serializers.CharField(required=True, allow_blank=False, max_length=100)
    content = serializers.CharField()

    def create(self, validated_data):
        return Container.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.title = validated_data.get('title', instance.title)
        instance.content = validated_data.get('content', instance.content)
        instance.save()
        return instance

在切换到RetrieveAppView之前,测试服务器的一切都很好。 错误是在切换到这种新的为我请求的方法时出现的

任何帮助都将不胜感激


Tags: instancepyselftruedatagettitlemodels
1条回答
网友
1楼 · 发布于 2024-04-16 15:27:54

让我们尝试模型序列化程序,如:请记住,您需要更新serializers.py、views.py和url.py文件以使其正常工作:

serialiers.py

from rest_framework import serializers
from . import models

class ContainerSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Container
        fields = ['id', 'created', 'title', 'content']

视图.py

from rest_framework import viewsets
from . import serializers
from . import models

class ContainerViewSet(viewsets.ModelViewSet):

    serializer_class = serializers.ContainerSerializer
    queryset = models.Container.objects.order_by('id')

url.py

from django.urls import include, path
from rest_framework import routers
from . import views

# rest:
router = routers.DefaultRouter()
router.register('containers', views.ContainerViewSet)

urlpatterns = [
    ...
    path('api/', include(router.urls))
]

现在我们可以完全访问rest,所以我们可以执行getputpostpatch、和delete请求等操作。对url <base-url>/api/containersget请求应该返回如下内容:

[
  {
    'id' : 1,
    'created' : 'YYYY-MM-DD',
    'title' : 'title-1',
    'content' : 'content-1'
  },
  {
    'id' : 2,
    'created' : 'YYYY-MM-DD',
    'title' : 'title-2',
    'content' : 'content-2'
  }
]

相关问题 更多 >