Reputation: 2589
Im trying to prefetch a mapping table based on a mapping table. How does prefetch link tables together? as the foreign key for circuits is the same in both tables, im not sure why they wouldn't join?
circuits = SiteCircuits.objects.all() \
.exclude(circuit__decommissioned=True) \
.select_related('site') \
.select_related('circuit') \
.prefetch_related('circuitnotes_set') \
.prefetch_related('circuit__circuit_type') \
.prefetch_related('circuit__circuitfiles') \
.prefetch_related('circuit__provider') \
.prefetch_related('circuit__service_contacts') \
.prefetch_related('circuit__circuit_type')
models are as such:
class SiteCircuits(models.Model):
site = models.ForeignKey(SiteData, on_delete=models.CASCADE)
circuit = models.ForeignKey(Circuits, on_delete=models.CASCADE)
site_count = models.IntegerField(verbose_name="How many sites circuit is used at?", blank=True, null=True)
active_link = models.BooleanField(default=False, verbose_name="Active Link?")
class Meta:
verbose_name = "Site Circuits"
verbose_name_plural = "Site Circuits"
unique_together = ('site', 'circuit',)
class CircuitNotes(models.Model):
circuit = models.ForeignKey(Circuits, on_delete=models.CASCADE)
notes = models.ForeignKey(Notes, on_delete=models.CASCADE)
class Meta:
verbose_name = "Circuit Notes"
verbose_name_plural = "Circuit Notes "
unique_together = ('circuit', 'notes',)
Ive also tried adding a QuerySet filter to match the circuit id's but the variable circuit_id doesnt exist, im not sure if I can filter based on an object id in this manner?
circuits = SiteCircuits.objects.all() \
.exclude(circuit__decommissioned=True) \
.select_related('site') \
.select_related('circuit') \
.prefetch_related(
Prefetch(
'circuitnotes_set',
queryset=CircuitNotes.objects.filter(circuit_id=circuit_id)
)
) \
.prefetch_related('circuit__circuit_type') \
.prefetch_related('circuit__circuitfiles') \
.prefetch_related('circuit__provider') \
.prefetch_related('circuit__service_contacts') \
.prefetch_related('circuit__circuit_type')
Upvotes: 1
Views: 2166
Reputation: 308839
There is no relationship between SiteCircuits
and CircuitNotes
so .prefetch_related('circuitnotes_set')
isn't going to work. You need to go via the circuit
model:
circuits = SiteCircuits.objects.all() \
.prefetch_related('circuit__circuitnotes_set')
Upvotes: 3