Извлекать только значения без ключа из QuerySet и сохранять их в списке - PullRequest
0 голосов
/ 10 ноября 2018

У меня проблема с получением только значений из QuerySet. У меня есть стол:

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'

и в 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)

и с console.log () в HTML-файле я проверяю значения, в настоящее время они: enter image description here

Но я хочу получить только значение без ключа. Например, : enter image description here

Любая помощь будет высоко ценится

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Для этого вы должны использовать функцию «values_list» вместо «values», а если вам нужно только одно поле, используйте flat = True:

temp_values = Temperature.objects.using('sensors').values_list('value', flat=True)
0 голосов
/ 10 ноября 2018

Вместо этого можно использовать values_list(..) [Django-doc] и указать flat=True, например:

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

, но вышеприведенное не безопасно. Набор запросов - если вы его не укажете - неупорядочен. Это означает, что два запроса могут привести к данным, которые не «совпадают» в том смысле, что первое значение time само по себе не соответствует первому значению value, хотя это может быть нетипичным поведением (в некоторых / большинстве баз данных систем), вы обычно никогда не хотите, чтобы это произошло. Это также приводит к двум запросам, что неэффективно.

Вы можете сначала получить значения, а затем использовать map s (или zip) для транспонирования, например:

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))
    # ...
0 голосов
/ 10 ноября 2018

Если я правильно понимаю ваш вопрос, думаю, вы ищете values_list вместо values.

Кроме того, вам, вероятно, не нужен этот list() звонок - он просто замедлит работу и потратит память.

...