簡體   English   中英

Django:獲取所有對象和相關模型的第一條記錄

[英]Django: Get all objects and the first record of a related model

最初,我只是使用所有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 )

您可以像這樣創建模型屬性。

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來實現最佳效果。

您只需要執行以下操作:

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變量傳遞給模板

我認為,如果您很好地定義模型,則可以從該相機實例本身獲取與特定相機相關的所有相機日志。

因此,例如,如果您的模型定義如下:

from django.db import models

class Camera(models.Model):
    name = models.CharField()

class CameraLogs(models.Model):
    cameralog = models.ForeignKey(
        Camera, related_name='cameralogs')

因此,如果您有一個與camera相等的特定Camera實例,則說camera.cameralogs.all()應該返回屬於該Camera實例的所有cameralog。 您可以在這里https://docs.djangoproject.com/en/1.10/topics/db/examples/many_to_one/了解有關Django多對一關系的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM