我有一个脚本,它逐个获取list_of_animals中的值并对它们执行一些操作。
它的工作原理如下:
list_of_animals = ["Dog", "Cat", "Fish"]
for x in list_of_animals:
...
代码循环遍历此列表,一次一个动物并完成。
现在,为了下一步,我有一个这样的模型:
class MyModel(models.Model):
animal = models.CharField(max_length=25, unique=True, error_messages=
{'unique':"This animal is added already."})
timestamp = models.DateTimeField()
......以及SQLite数据库中的更多动物。所以我尝试用查询替换手动创建的list_of_animals
。
我试图像这样更改list_of_animals:
list_of_animals = [MyModel.objects.values_list('title', flat=True)]
但我收到错误:
expected str instance, ValuesListQuerySet found
其实我也尝试了很多其他方法,但没有成功 你能帮我找到一种用同样的方法替换手动创建的列表的方法吗?
谢谢!
答案 0 :(得分:2)
尝试:
list_of_animals = list(MyModel.objects.values_list('title', flat=True))
来自the docs:
请注意,此方法返回ValuesListQuerySet。这个班的表现 像一个清单。大部分时间这都足够了,但如果你需要的话 实际的Python列表对象,你可以简单地调用list()就可以了 将评估查询集。
答案 1 :(得分:2)
不要执行list_of_animals = [MyModel.objects.values_list('title', flat=True)]
,而是执行
list_of_animals = MyModel.objects.values_list('title', flat=True)
默认情况下,如果您将flat=True
与单个字段列表一起使用,MyModel将返回一个可迭代列表,如documentation here中所述:
如果只传入一个字段,也可以传入flat参数。如果为True,则表示返回的结果是单个值,而不是一个元组。一个例子应该使差异更清楚:
>>> Entry.objects.values_list('id').order_by('id')
[(1,), (2,), (3,), ...]
>>> Entry.objects.values_list('id', flat=True).order_by('id')
[1, 2, 3, ...]