我从模型中获取一个查询集,该模型将数据保存到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
答案 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()