django prefetch_related无效

时间:2013-07-29 07:53:08

标签: django one-to-many one-to-one manytomanyfield prefetch

我正在尝试使用prefetch_related导出我的所有数据库,但我只从主模型中获取数据。 我的模特:

class GvtCompoModel(models.Model):
    gvtCompo= models.CharField(max_length=1000, blank=False, null=False)
    ...

class ActsIdsModel(models.Model):
    year = models.IntegerField(max_length=4, blank=False, null=False)
    ...

class RespProposModel(models.Model):
    respPropos=models.CharField(max_length=50, unique=True)
    nationResp = models.ForeignKey('NationRespModel', blank=True, null=True, default=None)
    nationalPartyResp = models.ForeignKey('NationalPartyRespModel', blank=True, null=True, default=None)
    euGroupResp = models.ForeignKey('EUGroupRespModel', blank=True, null=True, default=None)

class ActsInfoModel(models.Model):
    #id of the  act
    actId = models.OneToOneField(ActsIdsModel, primary_key=True)
    respProposId1=models.ForeignKey('RespProposModel', related_name='respProposId1', blank=True, null=True, default=None)
    respProposId2=models.ForeignKey('RespProposModel', related_name='respProposId2', blank=True, null=True, default=None)
    respProposId3=models.ForeignKey('RespProposModel', related_name='respProposId3', blank=True, null=True, default=None)
    gvtCompo= models.ManyToManyField(GvtCompoModel)

我的观点:

dumpDB=ActsInfoModel.objects.all().prefetch_related("actId", "respProposId1", "respProposId2", "respProposId3", "gvtCompo")
for act in dumpDB.values():
    for field in act:
        print "dumpDB field", field

当我显示“field”时,我只看到ActsInfoModel中的字段,即起始模型。这是正常的吗?

2 个答案:

答案 0 :(得分:1)

通常情况下,您只能看到来自ActsInfoModel的字段。您可以通过点表示法访问相关模型,例如:

acts = ActsInfoModel.objects.all().prefetch_related("actId", "respProposId1", "respProposId2", "respProposId3", "gvtCompo")
for act in acts:
    print act.respProposId1.respPropos

相关模型已经预取,因此不会产生任何其他查询。仅供参考,引自docs

  

返回一个将自动检索的QuerySet   批处理,每个指定查找的相关对象。

答案 1 :(得分:1)

你还没有理解prefetch_related的参数。它不是字段列表,而是模型列表。

(请注意,您的字段命名约定也非常误导 - respProposId1和actId不是ID,而是模型的实际实例.Django通过附加_id在每种情况下创建了一个基础字段,因此db列是respProposId1_id和actId_id你应该只调用字段resp_propos1和resp_propos2 - 还要注意普通样式是lower_case_with_underscore,而不是capWords。)