当我尝试在浏览器中命中api/atoms/
端点时,在views.py文件中收到名称未定义的错误,但它的URL中有基本名称。
注意:这是一个非模型序列化程序和一个ViewSet。
错误
...views.py", line 74, in list
instance = atom.values(), many=True)
NameError: name 'atoms' is not defined
views.py
class AtomViewSet(viewsets.ViewSet):
serializer_class = AtomSerializer
def list(self, request):
serializer = AtomSerializer(
instance = atoms.values(), many=True) #<-------------
return Response(serializer.data)
urls.py
# 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)),
]
serializer.py
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
答案 0 :(得分:2)
这是找不到本地或全局名称时引发的基本python NameError
异常。
变量 atoms
未在 list()
方法中定义,也未在全局中定义,即为什么python解释器会引发异常。
在您的代码中,您将编写atoms.values()
,这迫使我认为您正在处理QuerySet,它可能是 Atom
模型。
class AtomViewSet(viewsets.ViewSet):
serializer_class = AtomSerializer
def list(self, request):
serializer = AtomSerializer(instance=Atom.objects.all(), many=True)
return Response(serializer.data)
注意:这是一个非模型序列化程序和一个ViewSet。
您正在执行 create
类中的 update
和 AtomSerializer
操作,以及那些直接连接到 模型 。我看不出有什么特殊的原因会阻止您使用此处的 ModelSerializer
。
除此之外,您还可以使用 路由器 ,当您处理 CRUD 操作时,这是一个不错的选择,因此我强烈建议您在代码中使用 ModelViewset
和 ModelSerializer
的组合。
答案 1 :(得分:1)
在您的views.py
中,您没有定义atom
,您需要先定义它,然后再使用它,否则您将得到该错误。
class AtomViewSet(viewsets.ViewSet):
serializer_class = AtomSerializer
def list(self, request):
# You need to define the atom first before passing it to your AtomSerializer
atoms = [] # or atom = Atom.objects.all()
serializer = AtomSerializer(
data=atoms,
many=True
)
return Response(serializer.data)