Hi there, I opened the above ticket and submitted a PR with fix and test added. I was asked to bring the issue here for wider review before the ticket is re-opened (if that is what people agree to do)
For reference, links to the ticket and PR are:
https://code.djangoproject.com/ticket/34555https://github.com/django/django/pull/16849The issue raised is that current implementation of ModelBase.__new__ prevents use of __init_subclass__ on a Model to add model fields
e.g. the code listed at the end of this email does not currently work (the PR fixes this).
Currently the same result could be achieved by i) writing a new metaclass e.g. BaseBookModelMeta or ii) using a class decorator where cls.add_to_class(field) is called.
Using __init_subclass__ is advised as a simpler alternative to writing a metaclass to customise class creation, hence this PR.
Hope that makes sense and appreciate any feedback. Thanks!
class BaseBookModel(models.Model):
class Meta:
abstract = True
def __init_subclass__(cls, author_cls, **kwargs):
super().__init_subclass__(**kwargs)
cls.author = models.ForeignKey(author_cls, on_delete=models.CASCADE)
class Author(models.Model):
name = models.CharField(max_length=256, unique=True)
class Book(BaseBookModel, author_cls=Author):
pass