views:

217

answers:

2

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.

+2  A: 

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.

chaos95
+1  A: 

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).

Denis Otkidach