我在从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()检查值,当前值为:
任何帮助将不胜感激
答案 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()
调用-这样只会减慢速度并浪费内存。