2015-01-09 2 views
1

У меня есть скрипт, который по одному присваивает значения из списка__изображений и выполняет некоторые действия с ними.
Это работает так:django query возвращает ошибку: ожидаемый экземпляр str, найденный ValuesListQuerySet

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

Try:

list_of_animals = list(MyModel.objects.values_list('title', flat=True)) 

От the docs:

Note that this method returns a ValuesListQuerySet. This class behaves like a list. Most of the time this is enough, but if you require an actual Python list object, you can simply call list() on it, which will evaluate the queryset.

+0

мю 無 's ответ, вероятно, лучше, если не нужен правильный список. –

+0

Да, спасибо. Кажется, правильный список - это то, что мне нужно. Это сработало для меня;) – Jagulari

2

Вместо того чтобы делать list_of_animals = [MyModel.objects.values_list('title', flat=True)], сделать

list_of_animals = MyModel.objects.values_list('title', flat=True) 

MyModel возвращает итератор список по умолчанию, если вы используете flat=True с список одиночных полей, как указано в documentation here:

If you only pass in a single field, you can also pass in the flat parameter. If True, this will mean the returned results are single values, rather than one-tuples. An example should make the difference clearer:

>>> Entry.objects.values_list('id').order_by('id') 
[(1,), (2,), (3,), ...] 

>>> Entry.objects.values_list('id', flat=True).order_by('id') 
[1, 2, 3, ...] 
+0

Спасибо, очень учебное сообщение! Почти работала для меня, и я тоже учился на будущее;) – Jagulari

Смежные вопросы