Django:获取所有对象和相关模型的第一条记录

时间:2017-02-01 20:49:28

标签: python django python-3.x django-models django-queryset

最初我只抓住所有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 )

3 个答案:

答案 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/