【问题标题】:Django: Get all objects and the first record of a related modelDjango:获取所有对象和相关模型的第一条记录
【发布时间】:2017-06-18 18:33:06
【问题描述】:

最初我只是抓取所有camera 模型:

cameras = Camera.objects.all()
return render(request, 'myapp/cameras.html', {'content': cameras})

但我现在还需要为上述语句中调用的每个Camera 包含CameraLog 的最新记录。 CameraLog 具有与之关联的 Camera 的外键。

我需要将这些摄像头传递给视图,因此我不仅需要能够循环遍历 Camera 数据,还需要循环遍历 CameraLog 日志。

我对 Python 还是很陌生,所以我相信这对你们来说是一个简单的修改......

cameras = Camera.objects.all( and also the latest CameraLog )

【问题讨论】:

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


    【解决方案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() 来指定查询集以非常优化地执行此操作。

    【讨论】:

    • 我当然喜欢这个主意。内循环看起来不完整?
    • 没有内循环。已更新。
    【解决方案2】:

    您只需要执行以下操作:

    cameras = Camera.objects.all()
    last_logs = [camera.cameralog_set.last for camera in cameras]
    

    换句话说,您的相机的 CameraLog(s) 已经设置,您可以使用 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 变量传递给模板

    【讨论】:

    • 刚刚更新了我的问题。我需要能够将完整的数据集发送到要循环的视图。
    • 你的意思是一个模板(HTML)文件?
    • 哦,哇……这……真是不可思议。我不知道。但是你也可以使用模板中的.first 吗?
    • 你是对的,由于错误(我没有添加.all 属性),我已经更新了我的答案。您也可以使用camera.cameralog_set.firstcamera.cameralog_set.last
    • 感谢您接受我的回答。如果您想投票,那也很棒。 :)
    【解决方案3】:

    如果您定义好模型,我认为您可以从该相机实例本身获取与特定相机相关的所有相机日志。

    例如,如果您的模型定义如下:

    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/

    【讨论】:

      猜你喜欢
      • 2013-12-22
      • 2011-01-15
      • 2017-08-06
      • 2015-09-01
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      相关资源
      最近更新 更多