Search code examples
djangodjango-modelsdjango-querysetdjango-ormprefetch

django prefetch_related not working


I am trying to export all my database with a prefetch_related but I only get data from the main model. My models:

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)

My view:

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

When I display "field", I see the fields from ActsInfoModel ONLY, the starting model. Is it normal?


Solution

  • It is normal, that you are seeing fields from ActsInfoModel only. You can access related models via dot notation, like:

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

    Related models are already prefetched, so it won't produce any additional queries. FYI, quote from docs:

    Returns a QuerySet that will automatically retrieve, in a single batch, related objects for each of the specified lookups.