我在仅从 QuerySet 获取值时遇到问题。 我有我的 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'
在 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() 我正在检查值,目前它们是:
非常感谢任何帮助
最佳答案
您可以使用 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
(或 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))
# ...
关于python - 从 QuerySet 中仅提取没有键的值并将它们保存到列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53239534/