django查询返回错误:预期的str实例,找到ValuesListQuerySet

时间:2015-01-09 11:50:09

标签: python django list django-queryset

我有一个脚本,它逐个获取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

其实我也尝试了很多其他方法,但没有成功 你能帮我找到一种用同样的方法替换手动创建的列表的方法吗?

谢谢!

2 个答案:

答案 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, ...]