3

我正在尝试使用 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

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

4

2 回答 2

2

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

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

于 2013-07-29T09:44:36.630 回答
1

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

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

相关模型已经预取,因此不会产生任何额外的查询。仅供参考,引用自文档

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

于 2013-07-29T08:20:27.303 回答