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_ipaddress
和end_ipaddress
的两个不同列中启动ipaddress /结束ipaddress
但正如您所看到的,我还能够搜索池名称,IP类型(ipv4 / ipv6),分配(公共/保留)和状态(启用/禁用)
我现在遇到的唯一问题是尝试BETWEEN
/ start_ipaddress
处理end_ipaddress
查询。
我尝试过使用GTE / LTE查询,但之后又返回了其他可能属于搜索范围内的IP池,但是我发现了更多具体的寻找IP&的方法#39;在游泳池之间。
基于此图片和我的搜索参数,我希望只返回1条记录,而不是此处列出的3条记录。
我很乐意提供任何其他细节。
答案 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)),)