django离开加入

时间:2009-04-20 19:28:59

标签: django left-join

我有一点左连接问题..我有以下模型

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

我需要获取所有服务器实例,如果有的话,请将CommandInfo加入其中。

现在我正在使用原始sql

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

3 个答案:

答案 0 :(得分:2)

您可以使用以下代码:

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

这将返回将s设置为外键的所有CommandInfo对象的列表。

您可以在Django文档中获取更多信息,“Following Relationships Backward”。

答案 1 :(得分:0)

有时Django ORM需要使用select_related()显式指定左连接字段名称。

这只是我的头脑,所以你可能需要调整它,但尝试类似:

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

答案 2 :(得分: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, [])

请注意,由于没有CommandInfo的服务器

,您需要获取服务器列表