首页 > 解决方案 > 检索所有包含特定 mixin 的类定义的正确方法是什么?

问题描述

我正在开发一个 django 应用程序,我想创建一个始终应用于模型定义的 mixin。mixin 添加的功能对于这个问题并不重要。

但是,我需要能够检索从该 mixin 继承的所有类定义的列表。这些类可以在 django 项目中的不同应用程序中。

到目前为止,我发现的可能答案是:

如何找到给定名称的类的所有子类?

如何在定义类时自动注册一个类

我主要想知道实现这一目标的最佳方法是什么。

标签: pythondjango

解决方案


通常,您获取继承特定类的所有类的列表的方式是通过使用元类注册这些类(如您所链接的问题之一中所述)。然而,Django 模型使用它们自己的元类来实现它们自动执行的许多操作。我不建议在混合中添加另一个元类——这里可能会出错!!

然而幸运的是,django 有一个叫做内容类型框架的东西 ,它本质上是一个特定项目中所有模型的注册表。

要获取所有模型的列表,您可以执行以下操作:

from django.contrib.contenttypes.models import ContentType

content_types = ContentType.objects.all()

这不会得到实际的模型,而是ContentType实例的查询集。然后从中获取模型类,您可以这样做

models = [x.model_class() for x in content_types]

所以我们现在有一个模型列表。然后我们可以将列表过滤到那些继承你的 mixin 的模型:

models_with_mixin = [x for x in models if issubclass(x, MyMixin)]

我们可以将以上所有内容简化为以下内容:

from django.contrib.contenttypes.models import ContentType

models_with_mixin = [
    x.model_class()
    for x in ContentType.objects.all()
    if issubclass(x.model_class(), MyMixin)
]

推荐阅读