Как конвертировать объект QuerySet в Django в список предсказывает?


Как я могу преобразовать Django QuerySet в список диктовок? Я не нашел ответа на этот вопрос, поэтому мне интересно, отсутствует ли у меня какая-то общая вспомогательная функция, которую все используют.

5 69

5 ответов:

использовать .values() способ:

>>> Blog.objects.values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]

Примечание: результат -QuerySet, который в основном ведет себя как список, но на самом деле не экземпляр list. Используйте list(Blog.objects.values(…)) если вам действительно нужен экземпляр list.

The .values() метод возвращает результат типа ValuesQuerySet обычно то, что вам нужно в большинстве случаев.

но если вы хотите, вы могли бы превратить ValuesQuerySet в собственный список Python с использованием понимания списка Python, как показано в примере ниже.

result = Blog.objects.values()             # return ValuesQuerySet object
list_result = [entry for entry in result]  # converts ValuesQuerySet into Python list
return list_result

Я считаю, что вышеизложенное помогает, если вы пишете модульные тесты и должны утверждать, что ожидаемое возвращаемое значение функции соответствует фактическому возвращаемому значению, и в этом случае оба expected_result и actual_result должны быть одного типа (например, словарь).

actual_result = some_function()
expected_result = {
    # dictionary content here ...
}
assert expected_result == actual_result

вы точно не определяете, как должны выглядеть словари, но, скорее всего, вы имеете в виду QuerySet.values(). Из официальная документация django:

возвращает a ValuesQuerySet - a QuerySet подкласс, который возвращает словари при использовании в качестве итерируемого, а не экземпляра модели объекты.

каждый из этих словарей представляет объект, с ключами соответствует именам атрибутов модели объекты.

Если вам по какой-то причине нужны собственные типы данных (например, сериализация JSON), это мой быстрый "грязный" способ сделать это:

data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]

Как вы можете видеть, построение диктатора внутри списка не очень сухо, поэтому, если кто-то знает лучший способ ...

можно использовать values() метод на dict вы получили из поля модели Django вы делаете запросы, а затем вы можете легко получить доступ к каждому полю по значению индекса.

назовем это так -

myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...