Reputation: 91
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:
But I want to retrive only value, without key. For e.g. :
Any help would be highly appreciated
Upvotes: 3
Views: 10834
Reputation: 477180
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 map
s (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))
# ...
Upvotes: 12
Reputation: 528
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)
Upvotes: 4
Reputation: 4728
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.
Upvotes: 1