如何在Django中返回一个对象和一个子对象

时间:2017-03-28 17:53:58

标签: python django django-views

我正在尝试显示相机对象及其最近的状态。我能够显示摄像头和最近的时间戳,但我正在努力访问相应的州字段。

我有以下Django模型。

class Camera(models.Model):

   name = models.CharField(max_length=32)


class TimeStamp(models.Model):

   camera = models.ForeignKey(Camera, on_delete=models.CASCADE)
   state = models.BooleanField(default=False)
   timeStamp = models.DateTimeField(db_index=True, auto_now_add=True, blank=True)

我有以下观点。

def index(request):
  context = {
    'cameras': Camera.objects.all().annotate(latest_timestamp=Max('timestamp__timeStamp')),
    'functional': Camera.objects.annotate(latest_timestamp=Max('timestamp__timeStamp')).filter(latest_timestamp=F('timestamp__timeStamp'), timestamp__state=True),
    'faulty': Camera.objects.annotate(latest_timestamp=Max('timestamp__timeStamp')).filter(latest_timestamp=F('timestamp__timeStamp'), timestamp__state=False),
   }

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

在我的index.html中,我有

<table class="table table-hover">
<thead class="text-info">
    <th>ID</th>
    <th>Name</th>
    <th>Current State</th>
    <th></th>
</thead>
    <tbody>
        {% for camera in cameras %}
            <tr>
                <td>{{ camera.id }}</td>
                <td>{{ camera.name }}</td>
                <td>{{ camera.latest_timestamp }}</td>
            </tr>
        {% endfor %}
    </tbody>

而不是camera.latest_timestamp,我想显示相应的状态字段。

2 个答案:

答案 0 :(得分:1)

因为每个camera可能有多个state,所以您不能简单地{{ camera.state }}

而是执行以下操作:

{% for camera in cameras %}
    <tr>
        <td>{{ camera.id }}</td>
        <td>{{ camera.name }}</td>
        {% for timestamp in camera.timestamp %}
            <td>{{ timestamp.state }}</td>
        {% endfor %}
    </tr>
{% endfor %}

答案 1 :(得分:1)

我会用这种方式定义我的Camera模型:

class Camera(models.Model):

   name = models.CharField(max_length=32)

   @property
   def latest_state(self):
       latest_timestamp = self.timestamp_set.latest('timeStamp')
       return latest_timestamp.state

并在模板中使用

{% for camera in cameras %}
<tr>
    <td>{{ camera.id }}</td>
    <td>{{ camera.name }}</td>
    <td>{{ camera.latest_state }}</td>
</tr>
{% endfor %}

我没有测试它。