AlexW
AlexW

Reputation: 2589

Django - prefetch query - Cannot find set on object, invalid parameter

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

Answers (1)

Alasdair
Alasdair

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

Related Questions