My problem is that I am trying to save into a postgres db some arrays, but it seems that it does not work, since the db is empty.
My models.py is as follows:
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))
My serializers.py is as follows:
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__')
And my views.py as follows:
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)
With the first view I save some data into the Event db and with the second one I get the last Event instance, I do some stuff and then I want to save the results in a db called Result with ArrayField.
I chose ArrayField, because my output is of the following form:
{
"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
}
So, an example of my db based on the above output will be as follows:
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
I am not getting any error right now, but my db remains empty, although I use serializer.save(). Any idea of how can I change my script in order to be able to save my data to the db?