Proper INET and CIDR fields for Django running on PostgreSQL

Aaron C. de Bruyn 03ff3d67f0 Switch to new Django 1.7 Lookups 10 years ago
netfields 03ff3d67f0 Switch to new Django 1.7 Lookups 10 years ago
.gitignore 0f5f513f1b Prepare for 0.2. Migrate from IPy to netaddr 12 years ago
.travis.yml c852a14e3b Update CI for Django 1.6 11 years ago
AUTHORS 0f5f513f1b Prepare for 0.2. Migrate from IPy to netaddr 12 years ago
CHANGELOG b5b1f13a02 Version 0.2.2 10 years ago
LICENSE 3f795d6d05 Add project files 15 years ago
MANIFEST.in a9f1ec4b3e Add testsettings.py to MANIFEST 12 years ago
README.rst ba8133dab5 Fix netaddr link 12 years ago
manage.py 263b634bf9 Support modern tools 12 years ago
requirements.txt 0f5f513f1b Prepare for 0.2. Migrate from IPy to netaddr 12 years ago
setup.py b5b1f13a02 Version 0.2.2 10 years ago
testsettings.py e23fbd2d79 Actually test in postgres instead of sqlite 12 years ago
tox.ini b5b1f13a02 Version 0.2.2 10 years ago

README.rst

Django PostgreSQL Netfields
===========================

.. image:: https://secure.travis-ci.org/jimfunk/django-postgresql-netfields.png

This project is an attempt at making proper PostgreSQL net related fields for
Django. In Django pre 1.4 the built in ``IPAddressField`` does not support IPv6
and uses an inefficient ``HOST()`` cast in all lookups. As of 1.4 you can use
``GenericIPAddressField`` for IPv6, but the casting problem remains.

In addition to the basic ``IPAddressField`` replacement a ``CIDR`` and
a ``MACADDR`` field have been added. This library also provides a manager that
allows for advanced IP based lookup directly in the ORM.

In Python, the values of these fields are represented as types from the
netaddr_ module.

.. _netaddr: http://pythonhosted.org/netaddr/

Dependencies
------------

Current version of code is targeting Django 1.3-1.4 support, as this relies
heavily on ORM internals supporting multiple versions is especially tricky. The
``netaddr`` module is used for the same reasons.

Getting started
---------------

Make sure ``netfields`` is in your ``PYTHONPATH``.

``InetAddressField`` will store values in PostgreSQL as type ``INET``. In
Python, the value will be represented as a ``netaddr.IPAddress`` object.

from netfields import InetAddressField, NetManager

class Example(models.Model):
inet = InetAddressField()
# ...

objects = NetManager()

``CidrAddressField`` will store values in PostgreSQL as type ``CIDR``. In
Python, the value will be represented as a ``netaddr.IPNetwork`` object.

from netfields import CidrAddressField, NetManager

class Example(models.Model):
inet = CidrAddressField()
# ...

objects = NetManager()

``MACAddressField`` will store values in PostgreSQL as type ``MACADDR``. In
Python, the value will be represented as a ``netaddr.EUI`` object. Note that
the default text representation of EUI objects is not the same as that of the
``netaddr`` module. It is represented in a format that is more commonly used
in network utilities and by network administrators (``00:11:22:aa:bb:cc``).

from netfields import CidrAddressField, NetManager

class Example(models.Model):
inet = CidrAddressField()
# ...

For ``InetAddressField`` and ``CidrAddressField``, ``NetManager`` is required
for the extra lookups to be available. Lookups for ``INET`` and ``CIDR``
database types will be handled differently than when running vanilla Django.
All lookups are case-insensitive and text based lookups are avoided whenever
possible. In addition to Django's default lookup types the following have been added.

* ``__net_contained``
* ``__net_contained_or_equal``
* ``__net_contains``
* ``__net_contains_or_equals``

These correspond with the operators from
http://www.postgresql.org/docs/9.1/interactive/functions-net.html

``netfields`` does not have to be in ``INSTALLED_APPS``.

Related Django bugs
-------------------

* 11442_ - Postgresql backend casts inet types to text, breaks IP operations and IPv6 lookups.
* 811_ - IPv6 address field support.

https://docs.djangoproject.com/en/dev/releases/1.4/#extended-ipv6-support is also relevant

.. _11442: http://code.djangoproject.com/ticket/11442
.. _811: http://code.djangoproject.com/ticket/811


Similar projects
----------------

https://bitbucket.org/onelson/django-ipyfield tries to solve some of the same
issues as this library. However, instead of supporting just postgres via the proper
fields types the ipyfield currently uses a ``VARCHAR(39)`` as a fake unsigned 64 bit
number in its implementation.

History
-------

Main repo was originaly kept https://github.com/adamcik/django-postgresql-netfields
Late April 2013 the project was moved to https://github.com/jimfunk/django-postgresql-netfields
to pass the torch on to someone who actually uses this code actively :-)