Сохранение данных в базу данных postgres с помощью сериализатора

Моя проблема в том, что я пытаюсь сохранить в postgres db некоторые массивы, но кажется, что это не работает, поскольку db пуста.

Моя models.py следующая:

from django.db import models
from django.contrib.postgres.fields import ArrayField
from django.contrib.auth import get_user_model

CustomUser = get_user_model()

class Event(models.Model):
    
    user_id_event = models.ForeignKey(CustomUser, on_delete=models.CASCADE, null=True)
    dr_notice_period = models.IntegerField(blank=True, null=True)
    dr_duration = models.IntegerField(blank=True, null=True)
    dr_request = models.FloatField(blank=True, null=True)

class Result(models.Model):

    event_id_result = models.OneToOneField(Event, on_delete=models.CASCADE, null=True)
    hvac_flex = ArrayField(models.FloatField(blank=True, null=True))
    dhw_flex = ArrayField(models.FloatField(blank=True, null=True))
    lights_flex = ArrayField(models.FloatField(blank=True, null=True))

Моя serializers.py следующая:

from rest_framework import serializers
from vpp_optimization.models import Event, Result

class EventSerializer(serializers.ModelSerializer):

    class Meta:
        model = Event
        fields = ('__all__')

class ResultSerializer(serializers.ModelSerializer):

    class Meta:
        model = Result
        fields = ('__all__')

А мой views.py следующим образом:

from rest_framework.response import Response
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework import status

from vpp_optimization.importer import DR_event_import_data
from vpp_optimization.utils import optimization_solution
from vpp_optimization.serializers import EventSerializer, ResultSerializer
from vpp_optimization.models import Event, Result

@api_view(['POST'])
@permission_classes([IsAuthenticated,])
def event(request):
    serializer = EventSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save(user_id_event=request.user)
        return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
    else:
        return Response({"status": "error", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)

@api_view(['GET'])
def optimization(request):
    last_event = Event.objects.last()

    if not last_event:
        return Response({"res": "Object Event does not exists"}, status=status.HTTP_400_BAD_REQUEST)

    serializer = EventSerializer(last_event)
    
    response_dict = {}
    DR_event_data = DR_event_import_data(serializer.data)
    response_dict = optimization_solution(DR_event_data)

    serializer_result = ResultSerializer(data=response_dict)
    if serializer_result.is_valid():
        serializer_result.save()
    
    return Response(response_dict, status=status.HTTP_200_OK)

С помощью первого представления я сохраняю некоторые данные в бд Event, а с помощью второго получаю последний экземпляр Event, делаю некоторые действия и затем хочу сохранить результаты в бд под названием Result с помощью ArrayField.

Я выбрал ArrayField, потому что мой вывод имеет следующий вид:

{
    "HVAC_flex[1,1]": 40.0,
    "HVAC_flex[1,2]": 0.0,
    "HVAC_flex[2,1]": 1.0,
    "HVAC_flex[2,2]": 0.0,
    "HVAC_flex[3,1]": 0.0,
    "HVAC_flex[3,2]": 34.0,
    "HVAC_flex[4,1]": 0.0,
    "HVAC_flex[4,2]": 2.0,
    "DHW_flex[1,1]": 12.0,
    "DHW_flex[1,2]": 11.0,
    "DHW_flex[2,1]": 49.0,
    "DHW_flex[2,2]": 14.0,
    "DHW_flex[3,1]": 21.0,
    "DHW_flex[3,2]": 32.0,
    "DHW_flex[4,1]": 26.0,
    "DHW_flex[4,2]": 15.0,
    "lights_flex[1,1]": 23.0,
    "lights_flex[1,2]": 13.0,
    "lights_flex[2,1]": 24.0,
    "lights_flex[2,2]": 1.0,
    "lights_flex[3,1]": 0.0,
    "lights_flex[3,2]": 12.0,
    "lights_flex[4,1]": 0.0,
    "lights_flex[4,2]": 11.0
}

Итак, пример моего db, основанного на вышеуказанном выводе, будет следующим:

 id | hvac_flex       | dhw_flex       | lights_flex     | event_id_result_id 
----+-----------------+----------------+-----------------+--------------------
  1   [40.0,0.0, ...]  [12.0,11.0, ...]  [23.0,13.0, ...]           1

Сейчас я не получаю никаких ошибок, но моя база данных остается пустой, хотя я использую serializer.save(). Есть идеи, как я могу изменить свой скрипт, чтобы иметь возможность сохранять данные в db?

В соответствии с JPG. Используйте ListField с аргументом child:

from rest_framework import serializers

class ResultSerializer(serializers.ModelSerializer):
    hvac_flex = serializers.ListField(child=serializers.FloatField())
    dhw_flex = serializers.ListField(child=serializers.FloatField())
    lights_flex = serializers.ListField(child=serializers.FloatField())

    class Meta:
        model = Result
        fields = ('__all__')
Вернуться на верх