【问题标题】:NameError in Django Rest Framework, it's showing my model name is not definedDjango Rest Framework 中的 NameError,它显示我的模型名称未定义
【发布时间】:2019-11-08 03:16:18
【问题描述】:

我正在尝试序列化数据库中的数据,以便可以访问客户端应用程序上的数据。 我刚接触 Django 1 个月。 请帮帮我。 执行此问题的正确方法是什么? 我只是希望它以 JASON 格式在数据中生成。 它给了我一个错误。 我在这里做错了什么? 不是这样吗?

这是错误:

/api/jobcardJobcard-ViewSet/ 处的名称错误 名称“工作卡”未定义 请求方法:GET 请求网址:http://127.0.0.1:8000/api/jobcardJobcard-ViewSet/ Django 版本:2.2 异常类型:名称错误 异常值:
名称“工作卡”未定义 异常位置:列表中的 /vagrant/jobcard_api/views.py 第 16 行 Python 可执行文件:/home/vagrant/beanalyticenv/bin/python3

我已经尝试过,其中 Jobcard 是我的型号名称

from jobcard_api.models import Jobcard

那么这给出了一个新的 NameError 错误

name 'JobcardSerializer' is not defined"

这是我在一个应用程序中的models.py,并且该应用程序在一个项目中,有三个应用程序并且它们都给出了不同名称的相同类型的错误

from django.db import models
class Jobcard(models.Model):
    """Database model for the jobcard"""
    id = models.AutoField(primary_key=True)
    jobcard_number = models.CharField(max_length=30, unique=True, blank=False), ..., observation = models.TextField(blank=True)
    def get_jobcard_number(self):
        """Retrieve jobcard number"""
        return self.equipment_name

这是我在一个名为 jobcard_api 的应用中的 serializers.py。

from rest_framework import serializers
from jobcard_api import models
class JobcardSerializer(serializers.ModelSerializer):
    """Serializer for the jobcard object"""
    class Meta:
        model = models.Jobcard
        fields = ('id', 'jobcard_number')
class DetailedJobcardSerializer(serializers.ModelSerializer):
    """Serializes the details of jobcard"""
    class Meta:
        model = models.Jobcard
        fields = ('id', 'jobcard_number',.., 'observation')
    def create(self, validated_data):
        """Create and return a new jobcard details"""
        jobcard = models.Jobcard.objects.create_jobcard(
            jobcard_number=validated_data['jobcard_number'],
            date_of_jobcard=validated_data['date_of_jobcard'],
            ..., observation=validated_data['observation']
        )
        return jobcard

这是我在一个名为 jobcard_api 的应用中的 views.py。

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import viewsets
from jobcard_api import serializers
from jobcard_api import models

class JobcardViewSet(viewsets.ViewSet):
    """Jobcard API ViewSet"""
    serializer_class = serializers.JobcardSerializer
    def list(self, request):
        """Returns a list of Data from databse"""
        jobcard_api = Jobcard.objects.all()
        serializer = JobcardSerializer(jobcard_api, many=True)
        return Response(serializer.data)
    def create(self, request):
        """Create new data in  databse"""
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(
                serializer.errors,
                status=status.HTTP_400_BAD_REQUEST
                )
    def retrieve(self, request, pk=None):
        """Handle updating an object"""
        return Response({'method':'PUT'})
    def update(self, request, pk=None):
        """Handle a partial update of an object"""
        return Response({'method':'PATCH'})
    def partial_update(self, request, pk=None):
        """Handle updating part of an object"""
        return Response({'http_method': 'PATCH'})
    def delete(self, request, pk=None):
        """Delete an object"""
        return Response({'method':'DELETE'})

这是我在一个名为 jobcard_api 的应用中的 urls.py。

from django.urls import include, path
from rest_framework.routers import DefaultRouter
from jobcard_api import views
from rest_framework import routers
router = routers.DefaultRouter()
router.register('Jobcard-ViewSet', views.JobcardViewSet, base_name='Jobcard-ViewSet')
urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

【问题讨论】:

  • 那里有很多代码,你还没有解释你在哪里看到这些消息。 (但请注意,此代码中的许多代码都是毫无意义的,因为它重复了 DRF 已经为您所做的事情。视图集中的所有方法以及序列化器 create 方法都可以删除。)
  • 这是我第一次发帖,对不起,我分享错误。

标签: django python-3.x django-models django-rest-framework django-views


【解决方案1】:

您的视图集的list 方法序列化程序访问有误。

您可以用self.serializer_class 替换您的直接JobcardSerializer(...) 实例,因为您已在serializer_class = ... 分配中正确分配。

...

class JobcardViewSet(viewsets.ViewSet):
    serializer_class = serializers.JobcardSerializer

    def list(self, request):
        ...
        serializer = self.serializer_class(jobcard_api, many=True)

【讨论】:

  • 感谢您的回复@wencakisa,但这给了我一个新的错误,即未定义 jobcard_api。但 jobcard_api 是我的应用名称。这里,/api/jobcardJobcard-ViewSet/ name 'jobcard_api' 处的 NameError 未定义 请求方法:GET 请求 URL:127.0.0.1:8000/api/jobcardJobcard-ViewSet Django 版本:2.2 异常类型:NameError 异常值:未定义名称 'jobcard_api' 异常位置:/清单中的 vagrant/jobcard_api/views.py 第 18 行
  • 但是当我把'jobcard_api = Jobcard.objects.all()然后我得到另一个错误,即在这里,/api/jobcardJobcard-ViewSet/名称'Jobcard'处的NameError未定义请求方法:GET请求URL:@ 987654322@ Django 版本:2.2 异常类型:NameError 异常值:未定义名称“作业卡”异常位置:列表中的 /vagrant/jobcard_api/views.py 第 16 行 Python 可执行文件:/home/vagrant/beanalyticenv/bin/python3
猜你喜欢
  • 2022-10-16
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2017-12-25
  • 2021-07-17
  • 2012-05-13
  • 2017-08-17
  • 2020-02-24
相关资源
最近更新 更多