Сериализатор DRF is_valid () == True, но .save () не является постоянным объектом модели - PullRequest
0 голосов
/ 14 мая 2019

Мои действия по списку, извлечению и уничтожению работают, как и ожидалось.

HTTP-ответ = 201 «создан»

"POST /api/atoms/?uid=04d38ad99b2a4353a18438c651eac5ab&created_at=2019-05-12T22:30:04.725089Z&updated_at=2019-05-12T22:30:07.053148Z&charge=1&mass=2 HTTP/1.1" 201 152

Внутри ViewSet

class AtomViewSet(viewsets.ViewSet):

    def create(self, request):
        serializer = AtomSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        # True

        serializer.save()
        # self.perform_create(serializer) # doesn't work
        # self.node.save() # doesn't work
        # headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED,) # headers=headers

Вот что я получаю, когда запускаю serializer.save()

<Atom: {'uid': '04d38ad99b2a4353a18438c651eac5qq', 'created_at': datetime.datetime(2019, 5, 12, 22, 30, 4, 725089, tzinfo=<UTC>), 'updated_at': datetime.datetime(2019, 4, 12, 22, 30, 7, 53148, tzinfo=<UTC>), 'charge': 0.0, 'mass': 1.0}>

Несмотря на обнадеживающие результаты сохранения, ресурс, как ни странно, не сохраняется в базе данных.

Я использую ViewSets и настраиваемый сериализатор для немодельной модели.AttributeError: 'AtomViewSet' object has no attribute 'perform_create'

Сериализатор

class AtomSerializer(serializers.Serializer):
    uid = serializers.CharField()
    created_at = serializers.DateTimeField()
    updated_at = serializers.DateTimeField()

    charge = serializers.FloatField()
    mass = serializers.FloatField()


    def create(self, validated_data):
        return Atom(**validated_data)

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

Я сейчас смотрю на свой сериализатор.Не уверен, что создание и обновление должны содержать

http://www.cdrf.co/3.1/rest_framework.serializers/Serializer.html

1 Ответ

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

В вашем AtomSerializer вы на самом деле не сохраняете объект, а просто создаете или изменяете его экземпляр в памяти, используйте save(), чтобы сохранить экземпляр в БД.

def create(self, validated_data):
    atom = Atom(**validated_data)
    atom.save()
    # Alternative you could use atom = Atom.objects.create(**validated_data)
    return atom

Аналогично дляВаш метод обновления, вам нужно сохранить объект после его изменения.

def update(self, instance, validated_data):
    for field, value in validated_data.items():
        setattr(instance, field, value)
    instance.save() # <-- saving the instance after setattr
    return instance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...