自定义序列化程序中未定义的DRF名称

时间:2019-05-11 14:58:59

标签: django-rest-framework serializer

当我尝试在浏览器中命中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

2 个答案:

答案 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)