0

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?

1 Answer 1

1

As per JPG. Use ListField with child argument:

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__')
Sign up to request clarification or add additional context in comments.

2 Comments

It still returns empty table, but it is a step towards the goal.
try char field instead of float field where child = floatfield

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.