我在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)