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

Reply via email to