【问题标题】:Django - prefetch query - Cannot find set on object, invalid parameterDjango - 预取查询 - 找不到对象集,无效参数
【发布时间】:2018-03-08 10:20:50
【问题描述】:

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

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

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    SiteCircuitsCircuitNotes 之间没有关系,所以 .prefetch_related('circuitnotes_set') 不起作用。您需要通过circuit 模型:

    circuits = SiteCircuits.objects.all() \
                            .prefetch_related('circuit__circuitnotes_set')
    

    【讨论】:

    • 我仍然收到错误在 Circuits 对象上找不到“circuitnotes”,“circuit__circuitnotes”是 prefetch_related() 的无效参数
    • 我的回答在任何地方都没有提到circuit__circuitnotes
    • 出于同样的原因,它在另一个函数上出错,现在根据您对这两个函数的建议进行了修复。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    相关资源
    最近更新 更多