1

我有一点左连接问题。我有以下型号

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

3 回答 3

2

您可以使用如下代码:

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

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

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

于 2009-04-20T19:58:56.030 回答
0

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

这只是我的想法,因此您可能需要对其进行调整,但请尝试以下操作:

s = Server.objects.select_related('commandinfo_set')
于 2009-04-20T22:25:43.167 回答
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 的情况下使用服务器

于 2011-03-16T15:10:29.113 回答