Django rest framework 自定义序列化程序中未定义DRF名称

Django rest framework 自定义序列化程序中未定义DRF名称,django-rest-framework,serialization,Django Rest Framework,Serialization,当我尝试在浏览器中点击我的api/atoms/端点时,我在views.py文件中得到一个名称未定义错误,但它在URL中有一个基本名称 注意:这是一个非模型序列化程序和一个视图集 错误 ...views.py", line 74, in list instance = atom.values(), many=True) NameError: name 'atoms' is not defined 视图.py class AtomViewSet(viewsets.ViewSet):

当我尝试在浏览器中点击我的
api/atoms/
端点时,我在views.py文件中得到一个名称未定义错误,但它在URL中有一个基本名称

注意:这是一个非模型序列化程序和一个视图集

错误

...views.py", line 74, in list
    instance = atom.values(), many=True)
NameError: name 'atoms' is not defined
视图.py

class AtomViewSet(viewsets.ViewSet):
    serializer_class = AtomSerializer

    def list(self, request):
        serializer = AtomSerializer(
            instance = atoms.values(), many=True) #<-------------
        return Response(serializer.data)
# for viewsets in views.py
router = DefaultRouter()
router.register(r'snippets', views.SnippetViewSet)
router.register(r'atoms', views.AtomViewSet, base_name='atoms')


urlpatterns = [
    path('', views.api_root),
    path('', include(router.urls)),

]
class AtomSerializer(serializers.Serializer):
    uid = UniqueIdProperty()
    created_at = DateTimeProperty()
    updated_at = DateTimeProperty()

    charge = IntegerProperty()
    mass = FloatProperty()

    def create(self, validated_data):
        return Atom(id=None, **validated_data)

    def update(self, instance, validated_data):
        for field, value in validated_data.items():
            setattr(instance, field, value)
        return instance
序列化程序.py

class AtomViewSet(viewsets.ViewSet):
    serializer_class = AtomSerializer

    def list(self, request):
        serializer = AtomSerializer(
            instance = atoms.values(), many=True) #<-------------
        return Response(serializer.data)
# for viewsets in views.py
router = DefaultRouter()
router.register(r'snippets', views.SnippetViewSet)
router.register(r'atoms', views.AtomViewSet, base_name='atoms')


urlpatterns = [
    path('', views.api_root),
    path('', include(router.urls)),

]
class AtomSerializer(serializers.Serializer):
    uid = UniqueIdProperty()
    created_at = DateTimeProperty()
    updated_at = DateTimeProperty()

    charge = IntegerProperty()
    mass = FloatProperty()

    def create(self, validated_data):
        return Atom(id=None, **validated_data)

    def update(self, instance, validated_data):
        for field, value in validated_data.items():
            setattr(instance, field, value)
        return instance

在您的
views.py
中,您没有定义
atom
,您需要在使用它之前先定义它,否则您将得到该错误

类AtomViewSet(ViewSet.ViewSet):
序列化程序_class=AtomSerializer
def列表(自我、请求):
#在将原子传递给AtomSerializer之前,需要先定义它
atoms=[]#或atom=atom.objects.all()
序列化程序=AtomSerializer(
数据=原子,
多=真
)
返回响应(serializer.data)

在您的
视图.py
中,您没有定义
atom
,您需要在使用它之前先定义它,否则您将得到该错误

类AtomViewSet(ViewSet.ViewSet):
序列化程序_class=AtomSerializer
def列表(自我、请求):
#在将原子传递给AtomSerializer之前,需要先定义它
atoms=[]#或atom=atom.objects.all()
序列化程序=AtomSerializer(
数据=原子,
多=真
)
返回响应(serializer.data)
这是在找不到本地或全局名称时引发的基本python异常。

变量
未在
列表()中定义或全局定义,这就是python解释器引发异常的原因。

在您的代码中,您会编写
atoms.values()
,这迫使我认为您正在处理一个查询集,它可能是一个
Atom
模型

class AtomViewSet(viewsets.ViewSet):
    serializer_class = AtomSerializer

    def list(self, request):
        serializer = AtomSerializer(instance=Atom.objects.all(), many=True) 
        return Response(serializer.data)
类AtomViewSet(ViewSet.ViewSet):
序列化程序_class=AtomSerializer
def列表(自我、请求):
serializer=AtomSerializer(实例=Atom.objects.all(),many=True)
返回响应(serializer.data)

注意:这是一个非模型序列化程序和一个视图集

您正在
类中执行
update
操作,这些操作直接连接到模型。我看不出有什么特别的原因会让你放弃使用
模型序列化程序


除此之外,你正在使用路由器,当你处理CRUD操作时,这是一个很好的选择,因此,我强烈建议您在代码中结合使用
ModelViewset
ModelSerializer

这是在找不到本地或全局名称时引发的基本python异常。

变量
未在
列表()中定义或全局定义,这就是python解释器引发异常的原因。

在您的代码中,您会编写
atoms.values()
,这迫使我认为您正在处理一个查询集,它可能是一个
Atom
模型

class AtomViewSet(viewsets.ViewSet):
    serializer_class = AtomSerializer

    def list(self, request):
        serializer = AtomSerializer(instance=Atom.objects.all(), many=True) 
        return Response(serializer.data)
类AtomViewSet(ViewSet.ViewSet):
序列化程序_class=AtomSerializer
def列表(自我、请求):
serializer=AtomSerializer(实例=Atom.objects.all(),many=True)
返回响应(serializer.data)

注意:这是一个非模型序列化程序和一个视图集


您正在
类中执行
update
操作,这些操作直接连接到模型。我看不出有什么特别的原因会让你放弃使用
模型序列化程序


除此之外,你正在使用路由器,当你处理CRUD操作时,这是一个很好的选择,因此,我强烈建议您在代码中结合使用
ModelViewset

使用一个图形数据库库,该数据库不使用常规模型类如果您的逻辑正常工作,请继续使用它。我的答案呢?这解决了你的问题吗?是的,谢谢。现在我了解到视图正在从序列化程序来回传递数据,并且仍然负责使用不使用常规模型类的图形数据库库提供数据。如果您的逻辑正常工作,请继续。我的答案呢?这解决了你的问题吗?是的,谢谢。现在我了解到视图正在从序列化程序来回传递数据,并且仍然负责提供数据“AssertionError:当序列化程序被传递时,必须调用
数据
关键字参数。在尝试访问序列化的
数据
表示之前,必须调用
是否有效()“AssertionError:当序列化程序被传递一个
数据
关键字参数时,在尝试访问序列化的
数据
表示之前,必须调用
.is\u valid()
。”