查询两个数字

时间:2016-04-11 15:33:44

标签: django postgresql

Django Version 1.9.5

我基本上追求的是这个问题:

SELECT *
FROM "ipaddress_setup"
WHERE '167837954' BETWEEN "start_ipaddress" AND "end_ipaddress"

在查询中可能还有其他WHERE语句,以下是我目前所做的一个示例:

from django.core.paginator import Paginator
from database.models import IpaddressSetup
from django.db.models import Q
import ipaddress

class ServiceSearch:
    def __init__(self, request, get):
        self.request = request

        self.get = get

    def search(self):
        args = ()
        context = {}

        if 'name' in self.get and self.get['name'] is not None:
            context['name__icontains'] = self.get['name']

        if 'pool' in self.get and self.get['pool'] is not None:
            try:
                ip = ipaddress.ip_address(self.get['pool'])

                args = (Q(start_ipaddress__gte=int(ip)) | Q(end_ipaddress__lte=int(ip)),)
            except ValueError:
                pass

        if 'ipaddress_type' in self.get and self.get['ipaddress_type'] is not None:
            context['ipaddress_type__exact'] = self.get['ipaddress_type']

        if 'assigned' in self.get and self.get['assigned'] is not None:
            context['assigned__exact'] = self.get['assigned']

        if 'status' in self.get and self.get['status'] is not None:
            context['status__exact'] = self.get['status']

        result = IpaddressSetup.objects.all().filter(*args, **context).order_by('name')

        return Paginator(result, self.request.user.max_search)

这在搜索功能中用于在分配的池中查找IP地址。我将IP存储为INT,用于在名为start_ipaddressend_ipaddress的两个不同列中启动ipaddress /结束ipaddress

但正如您所看到的,我还能够搜索池名称,IP类型(ipv4 / ipv6),分配(公共/保留)和状态(启用/禁用)

我现在遇到的唯一问题是尝试BETWEEN / start_ipaddress处理end_ipaddress查询。

我尝试过使用GTE / LTE查询,但之后又返回了其他可能属于搜索范围内的IP池,但是我发现了更多具体的寻找IP&的方法#39;在游泳池之间。

enter image description here

基于此图片和我的搜索参数,我希望只返回1条记录,而不是此处列出的3条记录。

我很乐意提供任何其他细节。

2 个答案:

答案 0 :(得分:1)

这意味着OR

args = (Q(start_ipaddress__gte=int(ip)) | Q(end_ipaddress__lte=int(ip)),)

但你想要AND

... WHERE "start_ipaddress" <= 167837954 AND "end_ipaddress" => 167837954

或在Django的

context['start_ipaddress__lte'] = int(ip)
context['end_ipaddress__gte'] = int(ip)

答案 1 :(得分:1)

在第

args = (Q(start_ipaddress__gte=int(ip)) | Q(end_ipaddress__lte=int(ip)),)

你正在对子查询进行ORing:

start_ip&gt; = ip OR end_ip&lt; = ip

这将产生一切。

他们:

args = (Q(start_ipaddress__gte=int(ip)) & Q(end_ipaddress__lte=int(ip)),)