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