rom
rom

Reputation: 3672

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?

Upvotes: 3

Views: 5623

Answers (2)

Daniel Roseman
Daniel Roseman

Reputation: 600041

You haven't understood the arguments to prefetch_related. It's not a list of fields, but a list of models.

(Note that your field naming convention is also very misleading - respProposId1 and actId are not IDs, but actual instances of the models. Django has created an underlying field in each case by appending _id, so the db columns are respProposId1_id and actId_id. You should just call the fields resp_propos1 and resp_propos2 - also note that normal style is lower_case_with_underscore, not capWords.)

Upvotes: 3

alecxe
alecxe

Reputation: 474191

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.

Upvotes: 1

Related Questions