#35976: Persist original Meta class on Options instances -------------------------------+-------------------------------------- Reporter: Tim McCurrach | Owner: (none) Type: Uncategorized | Status: new Component: Documentation | Version: 5.1 Severity: Normal | Resolution: Keywords: | Triage Stage: Unreviewed Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 1 | UI/UX: 0 -------------------------------+-------------------------------------- Changes (by Tim McCurrach):
* component: Database layer (models, ORM) => Documentation * resolution: wontfix => * status: closed => new * type: New feature => Uncategorized Old description: > 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`!!) New description: 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. The attributes from the meta value are stored on a `original_attrs` attribute however. It might be a good idea to document this!! === Motivation for the documentation === 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. The `original_attrs` attribute is perfect for this, but as far as I can tell it isn't documented anywhere. -- -- Ticket URL: <https://code.djangoproject.com/ticket/35976#comment:3> 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 django-updates+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/django-updates/01070193a0a2e9e6-9c4d7fbf-cfe9-4b1c-88da-30265b468f2e-000000%40eu-central-1.amazonses.com.