How to query a Django model defining a IP range with two int fields (IP, mask)
-
05-07-2019 - |
Question
I have:
class Range(models.Model):
ip = models.IntegerField() # as produced by socket.inet_aton + struct.unpack
mask = models.IntegerField()
Given a certain IP, how can I get all the ranges that match this specific IP using the Django models?
If I were using raw SQL, I would use the database's bitwise operators, but the Django ORM doesn't support those.
Solution
The QuerySet API in Django 1.0 now includes the 'extra' method, described here in the Django docs. The extra method allows you to pass custom WHERE clauses to your QuerySet, which should allow you to use the bitwise comparison you need.
OTHER TIPS
To do faster query fitting the range you'd better store lower and upper IP of range as integer. Then selection of needed objects should be as simple as Range.objects.filter(ip_low__le=ip, ip_up__ge=ip)
.
I would recommend using python's iptools :
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow