'Extract only values without key from QuerySet and save them to list

I have problem with getting only values from QuerySet. I have my table:

class Temperature(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    name = models.TextField(blank=True, null=True)
    value = models.IntegerField(blank=True, null=True)
    time = models.TextField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'temperature'

and in views.py:

class ChartData(APIView):
    authentication_classes = []
    permission_classes = []

    def get(self, request, format=None):
        labels = list(Temperature.objects.using('sensors').values('time')) 
        temp_values = list(Temperature.objects.using('sensors').values('value'))

        data = {
            "labels": labels,
            "temperature": temp_values,
        }
        return Response(data)

and with console.log() in html file I'm checking values, currently they are:enter image description here

But I want to retrive only value, without key. For e.g. : enter image description here

Any help would be highly appreciated



Solution 1:[1]

You can use values_list(…) [Django-doc] instead, and specify flat=True, like:

def get(self, request, format=None):
    labels = list(Temperature.objects.using('sensors').values_list('time', flat=True)) 
    temp_values = list(Temperature.objects.using('sensors').values_list('value', flat=True))
    # ...

but the above is not safe. A queryset is - unless you specify it - unordered. That means that two queries can result in data that does not "match" in the sense that the first time value does not per se corresponds to the first value value, although this might be atypical behavior (in some/most database systems), you typically never want this to happen. It also here results in two queries, which is not efficient.

You can first fetch the values, and then use maps (or zip) to make a transpose, like:

from operator import itemgetter

def get(self, request, format=None):
    qs = Temperature.objects.using('sensors').values_list('time', 'value')
    labels = list(map(itemgetter(0), qs))
    temp_values = list(map(itemgetter(1), qs))
    # ...

Solution 2:[2]

For this you have to use the 'values_list' function instead of 'values', and if you only want one field, use flat=True:

temp_values = Temperature.objects.using('sensors').values_list('value', flat=True)

Solution 3:[3]

If I'm understanding your question correctly, I think you're looking for values_list instead of values.

Also, you probably don't need that list() call in there -- it'll just slow things down and waste memory.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Juan Ignacio Sánchez
Solution 3 jacobian