我正在尝试使用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中的字段,即起始模型。这是正常的吗?
答案 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。)