【问题标题】:django left joindjango左加入
【发布时间】:2010-10-20 15:57:10
【问题描述】:

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

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

【问题讨论】:

    标签: django left-join


    【解决方案1】:

    您可以使用如下代码:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • .select_related 不适用于反向关系,因此这不起作用。它仅适用于调用该方法的模型中的ForeignKey 和OneToOneField 字段。
      【解决方案3】:
      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 的情况下使用服务器

      【讨论】:

        猜你喜欢
        • 2014-02-11
        • 1970-01-01
        • 2014-07-03
        • 2011-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-28
        相关资源
        最近更新 更多