一对多连接

One To Many Connection

所以我有两个模型 Field 和 Sensor,它们具有 OneToMany 连接。我正在创建一个页面,其中包含所有字段,每当我单击一个字段时,我都会获得其各自的传感器。我制作了 4 个测试传感器(其中 3 个在 Field1 上,1 个在 Field2 上)但它打印第一个到第一个字段和第二个到第二个字段可能是因为 pk 参数。知道如何解决这个问题吗?

class Field(models.Model):

    friendly_name = models.CharField(max_length=24, blank=True)
    soil_type = models.CharField(max_length=24, choices=SOIL_TYPES, blank=True) 
    cultivation = models.CharField(max_length=128, choices=CULTIVATIONS, blank=True) 


class TreeSensor(models.Model):

    field = models.ForeignKey(Field, on_delete=models.CASCADE)
    datetime = models.DateTimeField(blank=True, null=True, default=None)

    sensor_name = models.CharField(max_length=200, blank=True)
    longitude = models.DecimalField(max_digits=22, decimal_places=16, blank=True, null=True)
    latitude = models.DecimalField(max_digits=22, decimal_places=16, blank=True, null=True)

查看:

def detail(request, field_id):
        try:
            sensor = models.TreeSensor.objects.get(pk=field_id)
        except models.TreeSensor.DoesNotExist:
            raise Http404("No sensors for this field")
        return render(request, 'dashboard/detail.html', {'sensor': sensor})

html:

<h1> {{ field.friendly_name}}</h1>
    {% for sensor in field.treesensor_set.all %}
        {{treesensor.sensor_name}}
        {%endfor%}

我不确定这行会打印出什么?在这种情况下,“models”是什么意思!

models.TreeSensor.objects.get(pk=field_id) 


但是,如果您传递了 field_id,这意味着 Field 模型的 ID,那么我认为您可以替换该过滤:

TreeSensor.objects.filter(field__pk=field_id)

是的,这似乎可以解决问题我也更改了模板

 {% for sensor in sensor %}
    <ul>
        <li>{{ sensor.sensor_name}}</li>
    </ul>
 {%endfor%}

并查看:

def detail(request, field_id):
    try:
        sensor = models.TreeSensor.objects.filter(field__pk=field_id)
    except sensor.DoesNotExist:
        raise Http404("No sensors for this field")
    return render(request, 'dashboard/detail.html', {'sensor': sensor})

我在正确的字段上安装了正确的传感器,但如果字段为空,http404 不会引发错误。

也许我在 does.not.exist 上做错了什么?如何只检查一个空查询并打印出相应的文本?谢谢