首页 > 解决方案 > Django 从 FK 的 FK 获取内容

问题描述

我的 django 项目遇到了麻烦。我有一个三层模型:

模型.py

class PLC(models.Model):
    name = models.CharField(max_length=50)


class Measure(models.Model):
    class Meta:
        unique_together = ('PLC', 'address', 'is_bit')
    PLC = models.ForeignKey(PLC, on_delete=models.CASCADE)
    address = models.IntegerField()
    is_bit = models.BooleanField()

class MeasureValue(models.Model):
    measure = models.ForeignKey(Measure, on_delete=models.CASCADE)
    value = models.TextField()

在我的view.py中,我希望能够从 plc 中获取度量值

class PLCViewSet(viewsets.ModelViewSet):
    queryset = PLC.objects.all()
    serializer_class = PLCSerializer


def measures(request, id):
    plc = PLC.objects.get(id=id)
    measures = Measure.objects.filter(PLC=id)
    values = MeasureValue.objects.filter(measure__PLC=id)

    context = {
        'PLC': plc,
        'MEASURES': measures,
        'VALUES': values
    }

    return render(request, 'measures.html', context)

不幸的是,我无法做出正确的filter()决定(数据存储在 sqlite 库中)。

标签: python-3.xdjangodjango-models

解决方案


你有没有研究过prefetch_relatedPrefetchPLC这些将允许您在获取实例时提取相关字段。然后您可以按如下方式访问它们:

plc = PLC.objects.prefetch_related('measure_set__measurevalue_set').filter(id=id).first()
plc.measure_set.all() # QuerySet of `Measure` that are filtered to the `plc`
for measure in plc.measure_set.all():
    measure.measurevalue_set.all() # QuerySet of `MeasureValue` that are filtered to the `measure` therefore `plc` 

推荐阅读