2013-07-29 91 views
2

我想导出所有数据库与prefetch_related但我只从主模型中获取数据。 我的模型:django prefetch_related not working

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 

当我显示的 “场”,我看到ActsInfoModel ONLY,起始模型的字段。这是正常的吗?

回答

1

这是正常现象,您只能看到ActsInfoModel的字段。您可以通过点符号访问相关模型,如:

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

相关车型已经预取,这样就不会产生任何额外的查询。仅供参考,引自docs

返回一个QuerySet会自动检索,在一个单一的 批次,每个指定查找的相关对象。

+0

好,谢谢,解决了! – rom

1

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

(请注意,你的领域命名约定也非常误导的 - respProposId1和ACTID没有ID,但该机型的实际情况的Django已经通过追加_id创建在每种情况下的基础字段,所以DB列respProposId1_id和。 。actId_id你应该只调用resp_propos1和resp_propos2领域 - 也注意到,正常风格lower_case_with_underscore,不capWords)

+0

感谢您的建议。 – rom