2017-02-01 4 views
0

Au début, je ne faisais que l'accaparement de tous les camera modèles:Django: Obtenez tous les objets et le premier enregistrement d'un modèle lié

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

Mais j'ai besoin maintenant d'inclure également le dernier enregistrement de CameraLog pour chaque Camera qui est appelé dans la déclaration ci-dessus. CameraLog a une clé étrangère pour le Camera auquel il est associé.

J'ai besoin de passer ces caméras à une vue, donc j'ai besoin de pouvoir boucler non seulement les données Camera, mais aussi le journal CameraLog.

Je suis assez nouveau pour Python, donc je suis sûr que ce soit une modification facile pour vous les gars ...

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

Répondre

1

Vous pouvez créer une propriété de modèle comme celle-ci.

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

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

maintenant dans vos modèles:

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

{% endfor %} 

Vous pouvez également utiliser prefetch_related et utiliser django prélecture() pour spécifier queryset à faire très optimale.

+0

J'aime cette idée, c'est certain. La boucle interne n'a pas l'air complète? – dcolumbus

+0

Il n'y a pas de boucle interne. Actualisé. –

0

Vous avez juste besoin de faire ce qui suit:

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

En d'autres termes, CameraLog (s) de votre caméra est déjà définie, et vous y accédez en utilisant l'attribut cameralog_set.

Rappelez-vous que vous pouvez accéder à des domaines connexes à l'aide <relatedfieldname>_set et à tous les éléments avec .all(), le premier avec .first() et le dernier avec .last()

MISE À JOUR

À partir de votre modèle, vous pouvez faire exactement la même

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

, il vous suffit donc de passer la variable cameras au modèle

+0

J'ai juste mis à jour ma question. Je dois pouvoir envoyer un ensemble de données complet à une vue pour faire une boucle. – dcolumbus

+0

avec une vue que vous voulez dire un fichier de modèle (HTML)? –

+0

Correct. Jetez un oeil ci-dessus maintenant ... – dcolumbus

0

Je pense que vous pouvez obtenir tous les caméralog liés à une caméra particulière de cette instance de caméra si vous définissez bien vos modèles.

Ainsi, par exemple, si vous avez vos modèles définis comme ceci:

from django.db import models 

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

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

Donc, si vous avez une instance de caméra particulier égale à la caméra, en disant camera.cameralogs.all() doit retourner tous cameralogs appartenant à cette instance de la caméra. Vous pouvez lire plus sur les relations de Django à plusieurs ici https://docs.djangoproject.com/en/1.10/topics/db/examples/many_to_one/