Kaydet (Commit) 399a8db3 authored tarafından k's avatar k Kaydeden (comit) Tim Graham

Fixed #28695 -- Allowed models to use __init_subclass__().

üst 9dd40597
...@@ -60,7 +60,7 @@ def subclass_exception(name, bases, module, attached_to): ...@@ -60,7 +60,7 @@ def subclass_exception(name, bases, module, attached_to):
class ModelBase(type): class ModelBase(type):
"""Metaclass for all models.""" """Metaclass for all models."""
def __new__(cls, name, bases, attrs): def __new__(cls, name, bases, attrs, **kwargs):
super_new = super().__new__ super_new = super().__new__
# Also ensure initialization is only performed for subclasses of Model # Also ensure initialization is only performed for subclasses of Model
...@@ -75,7 +75,7 @@ class ModelBase(type): ...@@ -75,7 +75,7 @@ class ModelBase(type):
classcell = attrs.pop('__classcell__', None) classcell = attrs.pop('__classcell__', None)
if classcell is not None: if classcell is not None:
new_attrs['__classcell__'] = classcell new_attrs['__classcell__'] = classcell
new_class = super_new(cls, name, bases, new_attrs) new_class = super_new(cls, name, bases, new_attrs, **kwargs)
attr_meta = attrs.pop('Meta', None) attr_meta = attrs.pop('Meta', None)
abstract = getattr(attr_meta, 'abstract', False) abstract = getattr(attr_meta, 'abstract', False)
if not attr_meta: if not attr_meta:
......
...@@ -153,7 +153,7 @@ Migrations ...@@ -153,7 +153,7 @@ Migrations
Models Models
~~~~~~ ~~~~~~
* ... * Models can now use ``__init_subclass__()`` from :pep:`487`.
Requests and Responses Requests and Responses
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
......
import unittest
from operator import attrgetter from operator import attrgetter
from django.core.exceptions import FieldError, ValidationError from django.core.exceptions import FieldError, ValidationError
from django.db import connection, models from django.db import connection, models
from django.test import SimpleTestCase, TestCase from django.test import SimpleTestCase, TestCase
from django.test.utils import CaptureQueriesContext, isolate_apps from django.test.utils import CaptureQueriesContext, isolate_apps
from django.utils.version import PY36
from .models import ( from .models import (
Base, Chef, CommonInfo, GrandChild, GrandParent, ItalianRestaurant, Base, Chef, CommonInfo, GrandChild, GrandParent, ItalianRestaurant,
...@@ -156,6 +158,23 @@ class ModelInheritanceTests(TestCase): ...@@ -156,6 +158,23 @@ class ModelInheritanceTests(TestCase):
self.assertIs(C._meta.parents[A], C._meta.get_field('a')) self.assertIs(C._meta.parents[A], C._meta.get_field('a'))
@unittest.skipUnless(PY36, 'init_subclass is new in Python 3.6')
@isolate_apps('model_inheritance')
def test_init_subclass(self):
saved_kwargs = {}
class A:
def __init_subclass__(cls, **kwargs):
super().__init_subclass__()
saved_kwargs.update(kwargs)
kwargs = {'x': 1, 'y': 2, 'z': 3}
class B(A, models.Model, **kwargs):
pass
self.assertEqual(saved_kwargs, kwargs)
class ModelInheritanceDataTests(TestCase): class ModelInheritanceDataTests(TestCase):
@classmethod @classmethod
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment