Django - 预取查询 - 无法在对象上找到set,无效参数

时间:2018-03-08 10:20:51

标签: django django-models

我试图根据映射表预取映射表。预取链接表如何组合在一起?由于两个表中电路的外键相同,我不确定他们为什么不加入?

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')

模型就是这样:

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',) 

我还尝试添加一个QuerySet过滤器以匹配电路ID,但变量circuit_id不存在,我不确定我是否可以这种方式基于对象id进行过滤?

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')

1 个答案:

答案 0 :(得分:3)

SiteCircuitsCircuitNotes之间没有任何关系,因此.prefetch_related('circuitnotes_set')无效。您需要通过circuit模型:

circuits = SiteCircuits.objects.all() \
                        .prefetch_related('circuit__circuitnotes_set')
相关问题