Python PreTech一个类实例的多对多关系
我想限制对详图视图的查询。我想在更少的查询中访问一个类实例的多对多字段。它似乎不适用于Python PreTech一个类实例的多对多关系,python,django,django-views,django-orm,Python,Django,Django Views,Django Orm,我想限制对详图视图的查询。我想在更少的查询中访问一个类实例的多对多字段。它似乎不适用于get,服务器会针对每个多个字段访问数据库 JobInstance=Job.objects.get(pk=id).预回迁相关(“城市”).预回迁相关(“体验级别”)您可以通过重新排序让它工作,如: job_instance = Job.objects.prefetch_related('cities', 'experience_level').get(pk=id) job\u实例=job.objects.pre
get
,服务器会针对每个多个字段访问数据库
JobInstance=Job.objects.get(pk=id).预回迁相关(“城市”).预回迁相关(“体验级别”)
您可以通过重新排序让它工作,如:
job_instance = Job.objects.prefetch_related('cities', 'experience_level').get(pk=id)
job\u实例=job.objects.prefetch\u相关('cities','experience\u level').get(pk=id)
在执行.get(…)
时,在查询集上定义了与.prefetch\u相关的(…)
,然后获取对象,不再使用查询集
但是对于单个对象,.prefetch\u related(..)
将而不是提高效率。毕竟,.prefetch\u related(..)
将在这里进行两个额外的查询,以获取相关对象,与不预取一样多,然后评估作业实例的相关对象
.prefetch\u related(..)
因此在批量获取多个对象的相关对象时非常有用。使用prefetch\u related时,它实际上会再次命中数据库。最好调用返回数据的类实例的函数。@csandreas1:wellprefetch\u related
和job\u instance.cities.all()
(没有这样的预取)都会导致额外的查询,因此,正如所说的,您不会“获得”.select\u related(…)
将“背驮”查询以获取对象,但您不能将其用于一对多关系或多对多关系,因为这可能会生成大量重复记录。它实际上有好处!当多次使用带有关联数据的模板标记时,我不会点击database@csandreas1:如果您将job\u instance.cities.all()
存储在某个地方,它也不会再次访问数据库。它多次点击的原因是,如果您定义job\u instance.cities.all()
,您将复制旧的queryset,而没有缓存行为。