Go to file
Diederik van der Boor 6a32ffbf98 Docs: mention python 3 support 2013-05-20 17:12:25 +02:00
docs Docs: mention python 3 support 2013-05-20 17:12:25 +02:00
example Apply list filter in example app 2013-04-08 00:37:51 +02:00
polymorphic Port new code to Python 3 as well, fix six.with_metaclass() issues 2013-05-20 16:03:21 +02:00
.gitignore Applied an overal cleanup of the .gitignore file 2013-04-08 11:30:50 +02:00
.travis.yml Travis: don't test Django 1.4 against Python 3 2013-05-20 16:59:56 +02:00
AUTHORS.rst Port documentation to Sphinx, cleanup README 2013-05-19 17:15:41 +02:00
LICENSE updated docs, and moved them to DOCS.rst and README.rst 2010-01-26 14:28:22 +01:00
MANIFEST.in Include templates in install. 2012-12-10 18:02:12 +01:00
README.rst Mention the word "inherited models" in the docs more often 2013-05-19 17:19:24 +02:00
runtests.py Add runtests script 2013-04-05 09:52:53 +02:00
setup.py Porting to Python 3.2 2013-05-20 16:03:21 +02:00
tox.ini Port new code to Python 3 as well, fix six.with_metaclass() issues 2013-05-20 16:03:21 +02:00

README.rst

Polymorphic Models for Django
=============================

Django-polymorphic simplifies using inherited models in Django projects.
When a query is made at the base model, the inherited model classes are returned!

What is django_polymorphic good for?
------------------------------------

Let's take the models ``ArtProject`` and ``ResearchProject`` which inherit
from the model ``Project``, and store them in the database:

>>> Project.objects.create(topic="Department Party")
>>> ArtProject.objects.create(topic="Painting with Tim", artist="T. Turner")
>>> ResearchProject.objects.create(topic="Swallow Aerodynamics", supervisor="Dr. Winter")

If we want to retrieve all our projects, we do:

>>> Project.objects.all()

Using *django-polymorphic*, we simply get what we stored::

    [ <Project:         id 1, topic "Department Party">,
      <ArtProject:      id 2, topic "Painting with Tim", artist "T. Turner">,
      <ResearchProject: id 3, topic "Swallow Aerodynamics", supervisor "Dr. Winter"> ]

Using vanilla Django, we get the base class objects, which is probably not what we wanted::

    [ <Project: id 1, topic "Department Party">,
      <Project: id 2, topic "Painting with Tim">,
      <Project: id 3, topic "Swallow Aerodynamics"> ]

This also works when the polymorphic model is accessed via
ForeignKeys, ManyToManyFields or OneToOneFields.

Features
--------

* Full admin integation.
* ORM integration:

 * support for ForeignKey, ManyToManyField, OneToOneField descriptors.
 * Filtering/ordering of inherited models (``ArtProject___artist``).
 * Filtering model types: ``instance_of(...)`` and ``not_instance_of(...)``
 * Combining querysets of different models (``qs3 = qs1 | qs2``)
 * Support for custom user-defined managers.

* Uses the minumum amount of queries needed to fetch the inherited models.
* Disabling polymorphic behavior when needed.

While *django-polymorphic* makes subclassed models easy to use in Django,
we still encourage to use them with caution. Each subclassed model will require
Django to perform an ``INNER JOIN`` to fetch the model fields from the database.
While taking this in mind, there are valid reasons for using subclassed models.
That's what this library is designed for!

License
=======

Django-polymorphic uses the same license as Django (BSD-like).