试图了解sql查询是如何由django框架生成的?



我在pycharm中使用django调试器来看看ORM是如何发挥魔力的。我有一个简单的模型和一个非常基本的查询。Model.objects.get (id = 1)。click(调试器)中的第一步将我带到django.db.models.manager.py。得到在此模块中调用ManagerDescriptor类的方法。然后指针指向django.db.models.query,当init方法完成时,查询将凭空生成。查询在哪里选择了Model.name, Model.name。年龄……来自模特来自哪里?

进一步挖掘后,我注意到在self。_defer_next_filter=False执行查询属性获取值"select model.name, model。年龄……从model" .

class QuerySet:
"""Represent a lazy database lookup for a set of objects."""
def __init__(self, model=None, query=None, using=None, hints=None):
self.model = model
self._db = using
self._hints = hints or {}
self._query = query or sql.Query(self.model)
self._result_cache = None
self._sticky_filter = False
self._for_write = False
self._prefetch_related_lookups = ()
self._prefetch_done = False
self._known_related_objects = {}  # {rel_field: {pk: rel_obj}}
self._iterable_class = ModelIterable
self._fields = None
self._defer_next_filter = False  <<--- query generated after this line
self._deferred_filter = None

我相信我在这里错过了一些东西,如果有人知道内部工作或可以指导我在这方面的任何教程,请指导我。谢谢你

Model.objects.get(id=1)

Django为ORM Querset生成SQL查询,而不是单个对象我的意思是你可以打印SQL查询.filter().all()而不是.get()

注意-这里的.get()方法返回的是单个对象,而不是Queryset。

obj = Model.objects.filter(id=1)
print(obj.query)

相关内容

  • 没有找到相关文章

最新更新