Я до сих пор несколько новичок в Django, исходя из фона PHP, который так горел со мной.Запрос между двумя номерами
Джанго 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 для запуска IPAddress/окончание IPAddress в двух разных колонках имени start_ipaddress
и end_ipaddress
Но как вы можете видеть, я также позволяет возможность поиска по имени пула, тип IP (ipv4/ipv6), присвоенный (открытый/зарезервированный) и статус (включен/отключен)
Единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, чтобы получить запрос BETWEEN
на start_ipaddress
/end_ipaddress
.
Я пробовал использовать запросы GTE/LTE, но затем он возвращает другие IP-пулы, которые также могут попадать в параметры поиска, но я больше разбираюсь в конкретном способе поиска IP-адресов между пулом.
На основе этого образа и моих поисковых Params, мои надежды, чтобы вернуть только 1 запись вместо 3 перечисленных здесь.
Буду рад предоставить любые другие детали.
В чем проблема, если вы 'IpaddressSetup.objects.filter (start_ipaddress__lte = ф, end_ipaddress__gte = ф)'? –
Вы пробовали добавить 'LIMIT 1' в ваш запрос? –