Having used metaclasses in a similar situation before, but hoping to find
a less complex approach, I thought I might be able to implement this by
providing a __init_subclass__ method on my "template" model, with that
method designed to set up the ForeignKey to a given concrete model, but
this does not work. It seems that __init_subclass__ is called after
ModelBase.__new__ collects fields that require "contribute_to_class", so
the fields I add in __init_subclass__ are never "seen" by e.g. the
migration builder.
Example approach below (but note this does not work for reasons explained
above):
{{{#!python
from django.db.models import Model, ForeignKey, CASCADE, CharField
class BaseBookModel(Model):
class Meta:
abstract = True
def __init_subclass__(cls, author_model_cls: Type[Model], **kwargs,):
super().__init_subclass__(**kwargs)
author = ForeignKey(author_model_cls, on_delete = CASCADE)
cls.add_to_class('author', author)
class Author(Model):
name = CharField(max_len = 256, unique = True)
class Book(BaseBookModel, author_model_cls = Author):
pass
}}}
Essentially what I'd like is some way of doing some extra work after
BaseModel.__new__ is called without resorting to having to write a
metaclass for BaseBookModel - I'm just adding some extra fields and a
metaclass is complex for most mortals to read let alone write. There does
not seem to be an appropriate hook method that I can override to do this
for every subclass of BaseBookModel
Thanks for reading and appreciate any thoughts!
--
Ticket URL: <https://code.djangoproject.com/ticket/34555>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* status: new => closed
* resolution: => invalid
Comment:
Thanks for this ticket, however, it seems that you're rather asking for
help in your implementation. Trac is not an appropriate channel for this.
You can start a discussion on the DevelopersMailingList or on the
[https://forum.djangoproject.com/ Django Forum], where you'll reach a
wider audience and see what other think.
--
Ticket URL: <https://code.djangoproject.com/ticket/34555#comment:1>