Go to file
Diederik van der Boor 53f6fd76ee Merge pull request #39 from BertrandBordage/master
Simplifies add_type_form.html. See #38.
2013-07-05 02:24:21 -07:00
docs Increase version and add django 1.6 support to the changelog 2013-05-24 15:37:01 -06:00
example Apply list filter in example app 2013-04-08 00:37:51 +02:00
polymorphic Simplifies add_type_form.html. See #38. 2013-06-07 13:39:33 +02:00
.gitignore Applied an overal cleanup of the .gitignore file 2013-04-08 11:30:50 +02:00
.travis.yml Run travis tests on django dev 2013-05-24 15:13:57 -06: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 Update Travis image in README 2013-05-20 18:02:54 +02:00
runtests.py Add runtests script 2013-04-05 09:52:53 +02:00
setup.py Setup.py: update trove classifiers, read version from code. 2013-05-20 17:12:38 +02:00
tox.ini Python 3.2 support confirmed. 2013-05-20 17:34:09 +02:00

README.rst

.. image::  https://travis-ci.org/chrisglass/django_polymorphic.png?branch=master
  :target: http://travis-ci.org/chrisglass/django_polymorphic
  :alt: build-status

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.

When we store models that inherit from a ``Project`` model...

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

...and want to retrieve all our projects, the subclassed models are returned!

>>> Project.objects.all()
    [ <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 rarely what we wanted:

>>> Project.objects.all()
    [ <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!

For more information, see the `documentation at Read the Docs <https://django-polymorphic.readthedocs.org/>`_.

License
=======

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