Django-ORM:如何使用相关mod上的子查询过滤一个模型

2024-10-01 13:44:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我在引用django子查询的外部字段时遇到了困难,这在SQL中很容易做到。我有两种型号:

class Modem(models.Model):
    mac = Models.LowerCaseCharField

class DHCPEvent(models.Model):
    timestamp = models.DateTimeField() # date released
    modem = models.ForeignKey(Modem)
    ip = models.LowerCaseCharField()

IP分配给给定调制解调器a的时间窗口为:[IP分配给调制解调器a时的时间戳,IP分配给另一个调制解调器时的时间戳)。我希望能够查询与搜索时间窗口重叠的特定调制解调器的所有IP分配(modem,from_date,to_date->;[ips])。在

为此,我想我需要在时间窗口结束之前找到分配给调制解调器的DHCPEvent,然后,对于每个事件,在搜索时间窗口开始之前,确认其他地方没有分配给它的IP的DHCPEvent。这定义了IP到调制解调器的分配与搜索窗口重叠。但我不知道在Django怎么做。到目前为止,我得到的是:

^{pr2}$

有两个问题:

  1. 它抛出了“ValueError:thisqueryset包含对外部查询的引用,并且只能在子查询中使用。”对我来说,它似乎位于子查询内部。在
  2. 我需要OuterRefs只查看第二行中第一个引用的DHCPEvent,而不是连接到这个调制解调器的每个DHCPEvent。但我不知道该怎么表达。在

如有任何建议,我们将不胜感激。谢谢!在

编辑:我现在已经用SQL编写了这个查询,这可能会让我在Django中实现的目标更加清晰:

select 
    *
from 
    "MODEM" modem
        inner join "DHCPEVENT" dhcp_event_assign 
            on modem."ID" = dhcp_event_assign."MODEM_ID"
where
    modem."ID" = %(id)s
    dhcp_event_assign."TIMESTAMP" <= %(to_date)s and
    not exists(
        select 
            *
        from 
            "DHCPEVENT" dhcp_event_next
        where 
            dhcp_event_next."REMOTE_ADDRESS" = dhcp_event_assign."REMOTE_ADDRESS"
            and dhcp_event_next."TIMESTAMP" > dhcp_event_assign."TIMESTAMP"
            and dhcp_event_next."TIMESTAMP" <= %(from_date)s
            and not ( dhcp_event_next."MODEM_ID" = modem."ID" )
        )

Tags: andfromipeventid调制解调器datemodels