Django prefetch_related获取所有多个对象

时间:2013-04-09 13:36:46

标签: django django-models

我正在努力解决这个问题:

我需要获得所有多个对象并且正在考虑使用prefetch_related

这是我模特的样本:

class Company(models.Model):
    companyjobs = models.ManyToManyField(CompanyJob, related_name='jobs')

class CompanyJob(models.Model):
    source = models.CharField(_('Source'), max_length=64, db_index=True)

这是我试过的:

        search_results = Company.objects.prefetch_related('companyjobs')

现在我想访问companyjobs对象。 我该怎么做?

1 个答案:

答案 0 :(得分:0)

您可以直接从公司模型类的任何实例访问companyjobs,而无需prefetch_related

例如

# .all() will get all elements and [0] will get the first
company = Company.objects.all()[0]  

company.companyjobs
# this is actually a ManyToMany Manager
# you deal with it like any other manager so

for companyjob in company.companyjobs.all():
    # all() will again get all items in company.companyjobs
    # here you iterate over all companyjobs in that company
    ... # do what you must

现在,我们只有一家公司,并从那里开始所有的公司工作。

我们这样做的方式django将对数据库进行2次查询。

一个用于公司,一个用于工作

prefetch_related将'合并'那些查询合而为一 所以我们从db中获取公司时获得所有相关的工作

这非常方便,因为如果您不使用prefetch_related,您需要处理的公司越多,就会获得一个额外的查询来获取该公司的工作,从而大幅降低性能。

此处有更多信息:https://docs.djangoproject.com/en/1.7/ref/models/querysets/#prefetch-related