Brak zapisu mimo użycia metody save na serializerze

0

Cześć!

Mam problem z django rest framework:
models.py:

class Device(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=80)
    address = models.CharField(max_length=17)

kontroler:

    def post(self, request):
        serializer = DeviceSerializer(data=request.POST)

        if serializer.is_valid(raise_exception=True):
            serializer.save()

        return JsonResponse(serializer.data, status=status.HTTP_201_CREATED)

serializer:

class DeviceSerializer(serializers.Serializer):
    id = serializers.ReadOnlyField()
    name = serializers.CharField(max_length=80)
    address = serializers.CharField(max_length=17)

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

    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.address = validated_data.get('address', instance.address)
        instance.save()
        return instance

Niestety, po użyciu save w kontrolerze dostaję status 201, lecz do bazy danych nic nie leci.
Ktoś wie może czemu?

1

W sumie to co masz to chyba powinno działać, spójrz do debuggera co tam sie dzieje ewentualnie.

Jak coś spróbuj:

def create(self, validated_data):
        return Device.objects.create(**validated_data)
0
cmd napisał(a):

W sumie to co masz to chyba powinno działać, spójrz do debuggera co tam sie dzieje ewentualnie.

Jak coś spróbuj:

def create(self, validated_data):
        return Device.objects.create(**validated_data)

Dzięki wielkie, zmienienie na objects.create pomogło.

0

W sumie mnie jeszcze kilka rzeczy zastanowilo, jak tak patrze ;]

def post(self, request):
        serializer = DeviceSerializer(data=request.POST)

Tutaj raczej reqest.POST Ci nie przejdzie, powinienes odwołać sie do request.data

id = models.AutoField(primary_key=True)

Całkowicie zbędne, Django ORM sam dodaje domyślnie pole ID które jest PK

return JsonResponse(serializer.data, status=status.HTTP_201_CREATED)

Dlaczego nie używasz Response z rest_framework.response ? W tym wypadku to kosmetyka praktycznie ale raczej powinienes trzymać się responsa z DRF.

0

Czemu request.POST nie powinno zadziałać? Bardzo ładnie łapie. Za to przy PUT'cie za nic nie widzi żadnych wysłanych danych mimo form-encoded. Ogólnie co do request to nawet nie wiem jak to zmienić bo params jest parametrem które wrzuca Django.

0

W DRF do pobierania danych uzywamy request.data

0

Aż sobie to sprawdziłem, w sumie nie wiem co robisz w APIView ale standardowo u mnie request.POST to pusty QueryDict

1 użytkowników online, w tym zalogowanych: 0, gości: 1