2009-10-22 6 views
2

두 INT 필드 (IP, 마스크)와 IP 범위를 정의하는 장고 모델을 조회하는 방법 : 내가 사용이 특정 IP와 일치하는 모든 범위를 얻을 수있는 방법내가 가진

class Range(models.Model): 
    ip = models.IntegerField() # as produced by socket.inet_aton + struct.unpack 
    mask = models.IntegerField() 

가 특정 IP를 감안할 때, 장고 모델?

원시 SQL을 사용하는 경우 데이터베이스의 비트 연산자를 사용하지만 Django ORM은 지원하지 않습니다.

답변

4

Django 1.0의 QuerySet API에 Django 문서에 here이라고 표시된 '추가'메소드가 포함되었습니다. 추가 메서드를 사용하면 사용자 정의 WHERE 절을 QuerySet에 전달할 수 있으므로 필요한 비트 비교를 사용할 수 있습니다.

2

범위를 빠르게 맞추려면 범위의 하위 IP와 상위 IP를 정수로 저장하는 것이 좋습니다. 그런 다음 필요한 객체를 선택하면 Range.objects.filter(ip_low__le=ip, ip_up__ge=ip)처럼 간단해야합니다.