最初我只抓住所有camera
型号:
cameras = Camera.objects.all()
return render(request, 'myapp/cameras.html', {'content': cameras})
但我现在还需要在上述声明中为每个CameraLog
添加Camera
的最新记录。 CameraLog
具有与其关联的Camera
的外键。
我需要将这些摄像头传递给视图,因此我需要不仅可以遍历Camera
数据,还可以循环CameraLog
日志。
我对Python很陌生,所以我相信这对你们来说很容易修改......
cameras = Camera.objects.all( and also the latest CameraLog )
答案 0 :(得分:1)
您可以创建这样的模型属性。
class Camera(models.Model):
fields = models.Fields()
@property
def last_log(self):
return self.cameralog_set.first()
现在在你的模板中:
{% for camera in cameras %}
#show camera info
{{ camera.last_log }}
# show camera log info
{% endfor %}
您还可以使用prefetch_related并使用django Prefetch()指定queryset以非常优化地执行此操作。
答案 1 :(得分:0)
您只需要执行以下操作:
cameras = Camera.objects.all()
last_logs = [camera.cameralog_set.last for camera in cameras]
换句话说,您的相机的CameraLog已经设置,您可以使用cameralog_set
属性访问它们。
请注意,您可以使用<relatedfieldname>_set
访问相关字段,使用.all()
访问所有元素,第一个使用.first()
,最后一个使用.last()
<强>更新强>
从您的模板中,您可以完全相同
{% for camera in cameras %}
#show camera info
{% for log in camera.cameralog_set.all %}
# show camera log info
{% endfor %}
{% endfor %}
因此,您只需将cameras
变量传递给模板
答案 2 :(得分:0)
如果您很好地定义模型,我认为您可以从相机实例本身获取与特定相机相关的所有相关内容。
例如,如果您的模型定义如下:
from django.db import models
class Camera(models.Model):
name = models.CharField()
class CameraLogs(models.Model):
cameralog = models.ForeignKey(
Camera, related_name='cameralogs')
因此,如果你有一个特定的相机实例等于相机,说camera.cameralogs.all()
应该返回属于该相机实例的所有相机。您可以在此处阅读有关Django多对一关系的更多信息https://docs.djangoproject.com/en/1.10/topics/db/examples/many_to_one/