1 votes

django left join

J'ai un peu un problème de jointure à gauche J'ai les modèles suivants

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

J'ai besoin de récupérer toutes les instances du serveur et d'y joindre la CommandInfo s'il y en a une.

Pour l'instant, je le fais en sql brut.

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()

2voto

mipadi Points 135410

Vous pouvez utiliser un code comme le suivant :

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

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

Vous pouvez obtenir plus d'informations en consultant la documentation de Django, " Suivre les relations à rebours ".

0voto

Van Gale Points 21982

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

C'est juste une idée comme ça, alors vous devrez probablement la modifier, mais essayez quelque chose comme.. :

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

0voto

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, [])

Veuillez noter que vous devez obtenir la liste des serveurs pour pouvoir utiliser les serveurs sans CommandInfo.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X