1

我正在为这件事苦苦挣扎:

我需要获取所有多对多对象并且正在考虑使用 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 对象。我该怎么做?

4

1 回答 1

-1

您可以直接从 Company 模型类的任何实例访问 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将这些查询“合并”为一个,以便我们在从数据库中获取公司的同时获得所有相关工作

它非常方便,因为如果您不使用prefetch_related,您必须与更多的公司打交道,您需要进行一次额外的查询以获得该公司的工作,这会大大降低性能。

更多信息在这里:https ://docs.djangoproject.com/en/1.7/ref/models/querysets/#prefetch-related

于 2015-02-05T16:33:47.507 回答