Имя DRF не определено в пользовательском сериализаторе - PullRequest
1 голос
/ 11 мая 2019

Когда я пытаюсь попасть в конечную точку 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 ]

2 голосов
/ 11 мая 2019

Это базовый питон NameError Исключение возникает, когда локальное или глобальное имя не найдено.

Переменная atoms не определена в методе list() или глобально, поэтому интерпретатор python вызвал исключение.

В вашем коде вы написали бы atoms.values(), что заставляет меня думать, что вы имеете дело с QuerySet, который может быть Atom модель.

class AtomViewSet(viewsets.ViewSet):
    serializer_class = AtomSerializer

    def list(self, request):
        serializer = AtomSerializer(instance=<b>Atom.objects.all()</b>, many=True) 
        return Response(serializer.data)

Примечание: это не модельный сериализатор и ViewSet.

Вы выполняете create и update операций в своем классе AtomSerializer, и они напрямую связаны с модель . Я не вижу какой-либо конкретной причины, которая отталкивает вас от использования ModelSerializer здесь.

Кроме этого, вы используете * Маршрутизаторы 1053 * , которые становятся хорошим выбором, когда вы имеете дело с операциями CRUD , поэтому я настоятельно рекомендую вам использовать комбинацию ModelViewset и ModelSerializer в вашем коде.

1 голос
/ 11 мая 2019

В вашем 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)
...