从QuerySet中仅提取不带键的值,并将它们保存到列表中

时间:2018-11-10 13:38:53

标签: python django django-queryset

我在从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)

并使用html文件中的console.log()检查值,当前值为:enter image description here

但是我只想检索没有键的值。例如: enter image description here

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:4)

为此,您必须使用“ values_list”函数而不是“ values”,并且如果您只想要一个字段,请使用flat = True:

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

答案 1 :(得分:2)

您可以改用values_list(..) [Django-doc],并指定flat=True,例如:

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))
    # ...

但以上内容是安全的。除非您指定,否则查询集是无序的。这意味着从第一个time值本身不对应于第一个value值的意义上讲,两个查询可能导致数据“不匹配”,尽管这可能是非典型行为(某些/大多数数据库系统),您通常都不希望这种情况发生。这还会导致两个查询,效率不高。

您可以先获取值,然后使用map(或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))
    # ...

答案 2 :(得分:1)

如果我正确理解了您的问题,则认为您正在寻找的是values_list而不是values

此外,您可能不需要那里的list()调用-这样只会减慢速度并浪费内存。