Skip to main content
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 integration.

  • 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.

License

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

Metadata

Release files for django-polymorphic-ng 0.8.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for django-polymorphic-ng 0.8.0
File Interpreter ABI Platform
django_polymorphic_ng-0.8.0-py2.py3-none-any.whl Python 3, Python 2 none any Details

Release files / django_polymorphic_ng-0.8.0-py2.py3-none-any.whl

Download URL django_polymorphic_ng-0.8.0-py2.py3-none-any.whl
Size 43.3 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
47f02b4b72724ad9f39e567c9d115d1a4df18545c01fb8c9b1089e405744751b
BLAKE2b-256 checksum
How to use checksums
4c486018ddc2e34e8338418a60c86022e8bb0b63396f9230db1a54cf8a209803
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

This release

0.8.0 This release

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page