#35976: Persist original Meta class on Options instances
-------------------------------------+-------------------------------------
Reporter: Tim McCurrach | Type: New
| feature
Status: new | Component: Database
| layer (models, ORM)
Version: 5.1 | Severity: Normal
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 1 | UI/UX: 0
-------------------------------------+-------------------------------------
When a `model.Model` class is created
[https://github.com/django/django/blob/ded485464214a3f69b64402b7d82221279f80008/django/db/models/base.py#L112
the metaclass `pop`s off] any `Meta` attribue defined on the model
[https://github.com/django/django/blob/ded485464214a3f69b64402b7d82221279f80008/django/db/models/base.py#L122
before calling] `super.__new__()`. We do
[https://github.com/django/django/blob/ded485464214a3f69b64402b7d82221279f80008/django/db/models/base.py#L145
pass it as an argument] to the `Options` class, and
[https://github.com/django/django/blob/ded485464214a3f69b64402b7d82221279f80008/django/db/models/options.py#L136
it's stored] on the `Options` instance, however
[https://github.com/django/django/blob/ded485464214a3f69b64402b7d82221279f80008/django/db/models/options.py#L232
this is then deleted] whilst the `Options.contribute_to_class` class is
called.
As far as I can tell, there is no reason why it is important to delete the
original data stored in the class defined on the original model.
Admitedly, perhaps it could be stored with a better name to indicate it is
a non-functional reference to the original `Meta` class.
`instance._meta.meta` probably doesn't make much sense, but
`instance._meta.original_meta` might be more appropriate.
=== Motivation for feature request ===
The motivation for this came change is born out of a desire to write a
check that `db_table` is explicitly defined on all my models (even if it
matches the default value that django would apply). I can write checks
that require things like `ordering` is defined (or not defined) on a
model. The problem with `db_table` is that defaults are applied when
`contribute_to_class` is called. This means we need a reference to the
underlying original Meta data. This is not currently possible without
subclassing the metaclass (`ModelBase`) which is a step further than would
be ideal imo.
=== The fix ===
The fix should be very simple. We would just need to remove (or adapt) the
line of code linked above which deletes the meta-class. (We could maybe
use a better name than `original_meta`!!)
--
Ticket URL: <https://code.djangoproject.com/ticket/35976>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/django-updates/01070193992f9fec-57b2d286-5d20-4b4f-892f-252c521aea3a-000000%40eu-central-1.amazonses.com.