Proper INET and CIDR fields for Django running on PostgreSQL

James Oakley 0f5f513f1b Prepare for 0.2. Migrate from IPy to netaddr il y a 12 ans
netfields 0f5f513f1b Prepare for 0.2. Migrate from IPy to netaddr il y a 12 ans
.gitignore 0f5f513f1b Prepare for 0.2. Migrate from IPy to netaddr il y a 12 ans
.travis.yml adf3159f5b Add travis-ci.org setup for project. il y a 12 ans
AUTHORS 0f5f513f1b Prepare for 0.2. Migrate from IPy to netaddr il y a 12 ans
CHANGELOG 6ce94bddd8 Add CHANGELOG il y a 12 ans
LICENSE 3f795d6d05 Add project files il y a 15 ans
MANIFEST.in 263b634bf9 Support modern tools il y a 12 ans
README.rst 0f5f513f1b Prepare for 0.2. Migrate from IPy to netaddr il y a 12 ans
manage.py 263b634bf9 Support modern tools il y a 12 ans
requirements.txt 0f5f513f1b Prepare for 0.2. Migrate from IPy to netaddr il y a 12 ans
setup.py 0f5f513f1b Prepare for 0.2. Migrate from IPy to netaddr il y a 12 ans
testsettings.py e23fbd2d79 Actually test in postgres instead of sqlite il y a 12 ans
tox.ini 0f5f513f1b Prepare for 0.2. Migrate from IPy to netaddr il y a 12 ans

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