Ответ 1
Да, это просто другой тип, построенный как и любой другой тип.
Когда я делаю это,
>>> b = Blog.objects.all()
>>> b
Я получаю это:
>>>[<Blog: Blog Title>,<Blog: Blog Tile>]
Когда я спрашиваю, что тип b
,
>>> type(b)
Я получаю это:
>>> <class 'django.db.models.query.QuerySet'>
Что это значит? Это тип данных вроде dict
, list
и т.д.?
Будет оценен пример того, как я могу построить структуру данных, как QuerySet
.
Я хотел бы знать, как Django строит этот QuerySet
(кровавые подробности).
Да, это просто другой тип, построенный как и любой другой тип.
django queryset, как его название говорит, в основном набор (sql) запросов, в вашем примере выше print(b.query)
покажет вам sql запрос, сгенерированный из ваших вызовов django filter
.
Так как наборы запросов ленивы, запрос к базе данных выполняется не сразу, а только при необходимости - при оценке набора запросов. Это происходит, например, если вы вызываете его метод __str__
при его печати, если вы вызываете list()
для него, или, что происходит в основном, вы итерируете его (for post in b..
). Эта лень должна уберечь вас от выполнения ненужных запросов, а также позволяет, например, связывать наборы запросов и фильтры (вы можете фильтровать набор запросов так часто, как хотите).
QuerySet представляет собой набор объектов из вашей базы данных. Он может иметь нулевой, один или несколько фильтров. Фильтры сужают результаты запроса на основе данных параметров. В терминах SQL QuerySet соответствует выражению SELECT, а фильтр является ограничивающим предложением, например WHERE или LIMIT.
QuerySet - это список объектов данной модели, QuerySet позволяет считывать данные из базы данных.