2016-04-11 6 views
0

Я до сих пор несколько новичок в 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-адресов между пулом.

enter image description here

На основе этого образа и моих поисковых Params, мои надежды, чтобы вернуть только 1 запись вместо 3 перечисленных здесь.

Буду рад предоставить любые другие детали.

+1

В чем проблема, если вы 'IpaddressSetup.objects.filter (start_ipaddress__lte = ф, end_ipaddress__gte = ф)'? –

+0

Вы пробовали добавить 'LIMIT 1' в ваш запрос? –

ответ

1

В строке

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

вы ORing подзапросы:

START_IP> = ф ИЛИ END_IP < = ф

Это даст все.

И им:

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

Это означает, ИЛИ

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

но вы хотите и

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

или Джанго

context['start_ipaddress__lte'] = int(ip) 
context['end_ipaddress__gte'] = int(ip) 
Смежные вопросы