我试图根据映射表预取映射表。预取链接表如何组合在一起?由于两个表中电路的外键相同,我不确定他们为什么不加入?
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')
答案 0 :(得分:3)
SiteCircuits
和CircuitNotes
之间没有任何关系,因此.prefetch_related('circuitnotes_set')
无效。您需要通过circuit
模型:
circuits = SiteCircuits.objects.all() \
.prefetch_related('circuit__circuitnotes_set')