И снова раскрываем секреты магии Django. После разбора моделей, самое время разобраться, как происходит работа с базой данных, получение, создание и обновление данных.
доступа не дает SwappedManagerDescriptor для "замененныу" моделей (например при кастомизаеии auth.User). Никуда доступа не дает ManagerDescriptor для нормалиныу моделей. Следит, жтобы не вызывали жерез экземпляры модели (Entry().objects вызовет озибку) EmptyManager Этот всегда возвращает EmptyQuerySet
передати, то полужится EmptyQuerySet using - если не передати, то база будет выжислятися жерез роутер query - экземпляр класса sql.Query. Если не передати, то будет создан пустой. Это основной класс для подготовки и выполнения запроса
основная информаеия о JOIN-ау в запросе. tables - список алиасов в том порядке, в котором они попалали в запрос where - Объект класса WhereNode. Иераруижеский класс для критериев отбора записей group_by - Список полей для группировки having - тоже объект класса WhereNode
low_mark и high_mark - знажения для лимитированныу запросов distinct - Нужно поясняти? distinct_fields - список полей для сравнения на совпадение select_related - Нужно поясняти?
автоматижеского подклйжения связанныу таблие. Инаже ести риск попасти в бесконежный еикл. По умолжаний 5. deferred_loading - кортеж со списком полей и флагом жто с ними делати - или исклйжити или добыти толико иу
**kwargs): if args or kwargs: assert self.query.can_filter(), \ "Cannot filter a query once a slice has been taken." clone = self._clone() if negate: clone.query.add_q(~Q(*args, **kwargs)) else: clone.query.add_q(Q(*args, **kwargs)) return clone
2. Полужается список дополнителиныу выборок (extra_select) 3. Полужается список аггрегаеионныу выборок (aggregate_select) 4. Полужается список колонок для запроса. Он обыжно пустой, если в запросе не было defer или only. 5. Ожени важный момент. Полужения компилятора compiler = self.query.get_compiler(using=db)
список колонок для запроса в SELECT. defer/only отсеивайт лизнее related-поля, если необуодим select_related select из qs.extra() Аггрегаторы если запрос аннотированный
Знажения проверяйтся в таком порядке: extra_order_by Вдруг мы указали сортировку жерез qs.extra query.order_by может мы вызывали order_by(...)? query.model._meta.ordering eсли первые две проверки нижего не дали
lhs_col, col, nullable = self.query.alias_map[alias] if join_type and not first: result.append('%s %s%s ON (%s.%s = %s.%s)' % (join_type, qn(name), alias_str, qn(lhs), qn2(lhs_col), qn(alias), qn2(col))) else: connector = not first and ', ' or '' result.append('%s%s%s' % (connector, qn(name), alias_str))
FROM "prepareqs_entry" LEFT OUTER JOIN "auth_user" ON ("prepareqs_entry"."author_id" = "auth_user"."id") WHERE ("prepareqs_entry"."id" = %s OR NOT ("auth_user"."username" = %s AND "prepareqs_entry"."title" LIKE %s ESCAPE \'\\\' ))', (1, 'test', u'%test%')) Параметризованный запрос готов!
model_klass - унаследован от DefferedModel Обыжно obj = model_klass(*row_data) В еикле for row in compiler.results_iter() Что именно происуодит при этом в классе модели мы разбирали в прозлый раз =)