Django PostgreSQL Netfields

1.4.1 · active · verified Thu Apr 16

django-netfields provides robust PostgreSQL net-related fields for Django models, specifically `INET`, `CIDR`, `MACADDR`, and `MACADDR8` types. It addresses limitations of Django's built-in IP address fields by providing efficient database-native lookups and supporting IPv6. The library is actively maintained, with the current version being 1.4.1, and typically follows Django's release cycle for compatibility updates.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates defining a model with `InetAddressField`, `CidrAddressField`, and `MACAddressField`. It highlights the use of `NetManager` for advanced queries and shows how to create and retrieve objects using `ipaddress` and `netaddr` types.

import os
import django
from django.conf import settings
from django.db import models
from netfields import InetAddressField, CidrAddressField, MACAddressField, NetManager
import ipaddress
import netaddr

# Minimal Django setup for standalone script
if not settings.configured:
    settings.configure(
        INSTALLED_APPS=['netfields'],
        DATABASES={'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:'}},
        DEBUG=True
    )
django.setup()

class NetworkDevice(models.Model):
    name = models.CharField(max_length=100)
    ip_address = InetAddressField(unique=True)
    network = CidrAddressField(blank=True, null=True)
    mac_address = MACAddressField(blank=True, null=True)

    objects = NetManager()

    def __str__(self):
        return f"{self.name} - {self.ip_address}"

# Create database schema (in-memory for example)
with django.test.utils.override_settings(MIGRATION_MODULES={'netfields': None}):
    from django.core.management import call_command
    call_command('makemigrations', 'netfields', interactive=False, verbosity=0)
    call_command('migrate', interactive=False, verbosity=0)

# Usage examples

# Create instances with ipaddress/netaddr objects
device1 = NetworkDevice.objects.create(
    name='Router1',
    ip_address=ipaddress.ip_interface('192.168.1.1/24'),
    network=ipaddress.ip_network('192.168.1.0/24'),
    mac_address=netaddr.EUI('00:11:22:AA:BB:CC')
)
device2 = NetworkDevice.objects.create(
    name='Server1',
    ip_address=ipaddress.ip_address('192.168.1.100'),
    network=ipaddress.ip_network('192.168.1.0/24')
)

# Retrieve and query
print(f"Device 1: {device1}")
print(f"Device 2: {device2}")

# Lookup using NetManager's custom lookups
# Find devices within a network
subnet_devices = NetworkDevice.objects.filter(ip_address__net_contained_or_equal='192.168.1.0/24')
print(f"\nDevices in 192.168.1.0/24: {list(subnet_devices)}")

# Find networks that contain a specific IP
containing_networks = NetworkDevice.objects.filter(network__net_contains='192.168.1.50')
print(f"Networks containing 192.168.1.50: {list(containing_networks)}")

# Update an instance
device1.ip_address = ipaddress.ip_interface('10.0.0.1/8')
device1.save()
print(f"Updated Device 1 IP: {device1.ip_address}")

view raw JSON →