从queryset计算列表的元素

时间:2018-01-30 12:57:57

标签: python django list

我从模型中获取一个查询集,该模型将数据保存到charfield。字段显示在MultipleChoiceField表单上,其中包含CheckboxSelectMultiple小部件。最大选择量为5。

我想计算查询集中的元素数量。每个查询集可以在列表中的元素数量上有所不同。现在,当我得到列表的len时,该值是元素数量的5倍。字典中的列表不是列表而是其他内容吗?当我在没有查询集的情况下手动创建列表并获取所述列表的len时,该值是正确的。例如。包含3个元素的列表返回3.

query = MyModel.objects.all().values('myvalue')

print(query[0])
{'myvalue': "['3']"}
print(query[1])
{'myvalue': "['1', '4']"}

print(query[0]['myvalue']
['3']
print(query[1]['myvalue']
['1', '4']

print(len(query[0]['myvalue']))
5

print(len(query[1]['myvalue']))
10

2 个答案:

答案 0 :(得分:1)

使用 ast module 将字符串列表转换为列表对象并获取len

import ast

a = ast.literal_eval("['3']")      #print(len(ast.literal_eval(query[0]['myvalue'])))
b = ast.literal_eval("['1', '4']")
print len(a)  # returns 1
print len(b)  # returns 2

答案 1 :(得分:0)

如果使用charfield存储数据,则存储的所有内容都将转换为char,因此您无法直接使用len。 如果您使用postgres作为数据库后端,则可以使用JSONField或ListField。 如果您必须使用CharField或TextField,那么您需要先将其转换回来。您可以创建一个继承自TextField的自定义字段,它将在您使用它的任何地方执行它,或者只是在从数据库加载数据后使用json.loads()