如何重写Django模型的__new__元类方法

5 投票
1 回答
1927 浏览
提问于 2025-04-18 18:42

我正在使用 Django 1.6 和 Django 中的 模型继承。我想做的是,连接一个新的扩展类。

在 Python 中可以这样做:

class Meta(type):
    def __new__(cls, name, bases, newattrs):
        do_what_you_want_before()
        result= super(Meta, cls).__new__(cls, name, bases, newattrs)
        do_what_you_want_after()
        return result

class Foo:
    __metaclass__ = Meta

class SubFoo(Foo):
    pass

当这部分代码被初始化时,自定义的 __new__ 方法会被调用。

我该如何在 Django 中使用模型继承来实现这个呢?当你尝试用 Django 模型这样做时,会出现一个错误,如下所示:

TypeError: Error when calling the metaclass bases
    metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

谢谢。

1 个回答

9

与其从 type 继承,不如从 django.db.models.base.ModelBase 继承 (来源)。

撰写回答