cidrfield
provides a model field for django that allows the storage of an ip network on the db side by using ipaddress
to handle conversion to an ipaddress.ip_network
instance (or None) on the python side. It supports the use of __contains
and __in
to query the IP network that contain and belong to.
Add this to your django project by installing with pip:
pip install django-cidrfield
In your models, do something like the following:
from django.db import models
from cidrfield.models import IPNetworkField
class MyModel(models.Model):
# the regular params should work well enough here
ip_network = IPNetworkField()
# ... and so on
Then you can store a ip network like the following:
MyModel(ip_network='192.168.1.0/24').save()
And you can query a ip network like the following:
MyModel.objects.filter(ip_network='192.168.1.0/24')
MyModel.objects.filter(ip_network__contains='192.168.1.1')
MyModel.objects.filter(ip_network__in='192.168.0.0/16')
MyModel.objects.filter(ip_network__in=['192.168.0.0/16', '10.10.0.0/16'])
If you use DjangoQL, you can use CIDRQLSchema
like the following:
from django.contrib import admin
from djangoql.admin import DjangoQLSearchMixin
from cidrfield.schemas import CIDRQLSchema
from .models import MyModel
@admin.register(MyModel)
class MyModelAdmin(DjangoQLSearchMixin, admin.ModelAdmin):
list_display = ['ip_network']
search_fields = ('ip_network', )
djangoql_schema = CIDRQLSchema
- Fix IPv6 with integers less than 2**32 being detected as IPv4.
- Add support for Djangoql.
- Fixed the bug about
__in
query not supporting array.