Brak zapisu mimo użycia metody save na serializerze

Odpowiedz Nowy wątek
2019-09-06 23:57
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?

edytowany 1x, ostatnio: NickOver, 2019-09-06 23:57

Pozostało 580 znaków

2019-09-07 00:19
cmd

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)
edytowany 1x, ostatnio: cmd, 2019-09-07 00:19

Pozostało 580 znaków

2019-09-07 00:28
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.

Pozostało 580 znaków

2019-09-07 01:22
cmd
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.

edytowany 7x, ostatnio: cmd, 2019-09-07 01:29

Pozostało 580 znaków

2019-09-07 02:00
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.

Pozostało 580 znaków

2019-09-07 10:44
0

W DRF do pobierania danych uzywamy request.data

Pozostało 580 znaków

2019-09-07 11:01
cmd
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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