2017-02-01 4 views
0

Anfangs war ich nur greifen alle camera Modelle:Django: Holen Sie sich alle Objekte und den ersten Datensatz eines verwandten Modell

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

Aber ich muss jetzt auch die letzte Aufzeichnung von CameraLog für jeden Camera die aufgerufen wird, in der obigen Aussage. CameraLog hat einen Fremdschlüssel für den Camera, mit dem es verknüpft ist.

Ich muss diese Kameras zu einer Ansicht übergeben, so dass ich in der Lage sein, nicht nur die Camera Daten, sondern auch die CameraLog Protokoll Schleife über.

Ich bin ziemlich neu in Python, also bin ich sicher, dass dies eine einfache Modifikation für euch ...

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

Antwort

1

Sie können eine Modelleigenschaft wie folgt erstellen.

class Camera(models.Model): 
    fields = models.Fields() 

    @property 
    def last_log(self): 
      return self.cameralog_set.first() 

Jetzt in Ihrer Vorlage:

{% for camera in cameras %} 
    #show camera info 
    {{ camera.last_log }} 
    # show camera log info 

{% endfor %} 

Sie können auch prefetch_related verwenden und django Prefetch() verwenden, um anzugeben, queryset dies sehr optimal zu tun.

+0

Ich mag diese Idee, sicher. Die innere Schleife sieht nicht vollständig aus? – dcolumbus

+0

Es gibt keine innere Schleife. Aktualisiert. –

0

Sie müssen nur Folgendes tun:

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

Mit anderen Worten, die CameraLog (s) Ihrer Kamera sind bereits eingestellt, und Sie greifen auf sie mit dem Attribut cameralog_set zu.

Denken Sie daran, dass Sie zu verwandten Bereichen zugreifen können <relatedfieldname>_set und auf alle Elemente mit .all(), die erste mit .first() und die letzte mit .last()

UPDATE

aus Ihrer Vorlage verwenden, können Sie tun genau das gleiche

{% for camera in cameras %} 
    #show camera info 
    {% for log in camera.cameralog_set.all %} 
     # show camera log info 
    {% endfor %} 
{% endfor %} 

Also, Sie müssen nur die cameras Variable auf die Vorlage übergeben

+0

Nur meine Frage aktualisiert. Ich muss in der Lage sein, einen kompletten Datensatz an eine Ansicht zu senden, um sie zu durchlaufen. – dcolumbus

+0

mit einer Ansicht meinen Sie eine Vorlage (HTML) Datei? –

+0

Korrekt. Werfen Sie einen Blick oben jetzt ... – dcolumbus

0

Ich denke, Sie können alle Kamera bezogen auf eine bestimmte Kamera aus dieser Kamera Instanz selbst erhalten, wenn Sie Ihre Modelle gut definieren.

So zum Beispiel, wenn Sie Ihre Modelle wie folgt definiert:

from django.db import models 

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

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

Also, wenn Sie eine bestimmte Kamera-Instanz gleich Kamera und sagte camera.cameralogs.all() sollte alles cameralogs Rückkehr zu dieser Kamera Instanz gehört. Sie können mehr über Django viele-zu-eins-Beziehungen hier lesen https://docs.djangoproject.com/en/1.10/topics/db/examples/many_to_one/

Verwandte Themen