2009-04-20 5 views
1

J'ai un peu à gauche .. Je question joindre ai les modèles suivantsdjango gauche rejoindre

class CommandInfo(models.Model): 
    server = models.ForeignKey(Server) 
    count = models.IntegerField(default=1) 
    ts = models.DateTimeField(auto_now=True) 

class Server(models.Model): 
    name = models.CharField(max_length=100) 
    group = models.ForeignKey(ApplicationGroup, blank=True, default=0) 
    host = models.CharField(max_length=100) 
    ip = models.IPAddressField(db_index=True) 
    about = models.TextField() 
    firstTS = models.DateTimeField(auto_now_add=True) 
    lastTS = models.DateTimeField(auto_now=True) 
    processed = models.SmallIntegerField(max_length=1, default=0) 

    def __unicode__(self): 
     return self.host 

je dois saisir toutes les instances de serveur et à gauche se joindre au CommandInfo pour s'il y a un.

En ce moment, je le fais dans sql premières

from django.db import connection 
cursor = connection.cursor() 
cursor.execute("SELECT host,ts,count as host FROM servers_server LEFT JOIN cmds_commandinfo ON server_id=servers_server.id") 
servers = cursor.fetchall() 

Répondre

2

Vous pouvez utiliser le code comme suit:

s = Server.objects.get(id=1) 
cmdinfo = s.commandinfo_set.all() 

qui renverrait une liste de tous les objets qui ont CommandInfo s ensemble comme la clé étrangère.

Vous pouvez obtenir plus d'informations sur les documents Django, "Following Relationships Backward".

0

Parfois, l'ORM Django a besoin que le nom du champ de jointure gauche soit explicitement nommé avec select_related().

Ceci est juste à côté du haut de ma tête afin que vous aurez probablement besoin de ruser, mais essayer quelque chose comme:

s = Server.objects.select_related('commandinfo_set') 
+1

'.select_related' ne fonctionne pas sur les relations descendantes, cela ne fonctionnerait donc pas. Cela ne fonctionne que sur les champs 'ForeignKey' et' OneToOneField' dans le modèle sur lequel la méthode est appelée. –

0
commands_by_server_id = defaultdict(list) 
for c in CommandInfo.objects.select_related('server'): 
    commands_by_server_id[c.server.id].append(c) 

servers = Server.objects.all() 
for s in servers: 
    s.commands = commands_by_server_id.get(s.id, []) 

S'il vous plaît noter que vous devez obtenir la liste des serveurs qui vous est dû can servers without CommandInfo