从 ABC 和 django.db.models.Model 继承会引发元类异常

2024-01-30

我正在尝试使用Python 3实现一个Django数据模型类,它也是一个接口类。我这样做的原因是,我正在为我的同事编写一个基类,并且需要他全部实现三个方法他从我的课程中派生出来的。我试图为他提供一种简化的方式来使用我设计的系统的功能。但是,他必须重写一些方法来为系统提供足够的信息来执行他继承的类中的代码。

我知道这是错误的,因为它会引发异常,但我想要一个像下面的示例这样的类:

from django.db import models
from abc import ABC, abstractmethod

class AlgorithmTemplate(ABC, models.Model):
    name = models.CharField(max_length=32)

    @abstractmethod
    def data_subscriptions(self):
        """
        This method returns a list of topics this class will subscribe to using websockets

        NOTE: This method MUST be overriden!
        
        :rtype: list
        """

我知道我可以避免继承ABC类,但我想使用它,因为我不会在这里让你感到厌烦。

问题


将一个类(如上面的类)包含到我的项目中并运行后python manage.py makemigrations我收到错误:TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases。我搜索了 Stack Overflow,但只找到了如下解决方案:

class M_A(type): pass
class M_B(type): pass
class A(metaclass=M_A): pass
class B(metaclass=M_B): pass

class M_C(M_A, M_B): pass
class C:(A, B, metaclass=M_C): pass

我已阅读以下帖子:

使用 ABC、PolymorphicModel、django-models 会导致元类冲突 https://stackoverflow.com/questions/47319836/using-abc-polymorphicmodel-django-models-gives-metaclass-conflict

解决元类冲突 https://stackoverflow.com/questions/11276037/python-3-typeerror-metaclass-conflict-the-metaclass-of-a-derived-class-must-b

我已经尝试了这些解决方案的许多变体,但我仍然遇到了可怕的问题metaclass例外。帮助我,欧比旺·克诺比,你是我唯一的希望。 :-)


我有同样的需求并发现this https://gist.github.com/gavinwahl/7778717。为了清晰和完整,我修改了代码。基本上,您需要一个可用于所有模型接口的额外类。

import abc

from django.db import models


class AbstractModelMeta(abc.ABCMeta, type(models.Model)):
    pass


class AbstractModel(models.Model, metaclass=AbstractModelMeta):    
    # You may have common fields here.

    class Meta:
        abstract = True

    @abc.abstractmethod
    def must_implement(self):
        pass


class MyModel(AbstractModel):
    code = models.CharField("code", max_length=10, unique=True)

    class Meta:
        app_label = 'my_app'


test = MyModel(code='test')
> TypeError: Can't instantiate abstract class MyModel with abstract methods must_implement

现在您拥有了两全其美的优势。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 ABC 和 django.db.models.Model 继承会引发元类异常 的相关文章

随机推荐

  • SwiftUI 中的自定义模式转换

    我正在尝试使用以下命令重新创建 iOS 11 12 App StoreSwiftUI 让我们想象一下 故事 是点击卡片时显示的视图 我已经完成了卡片 但我现在遇到的问题是如何制作动画来显示 故事 由于我不擅长解释 这里有一个 gif Gif
  • 以编程方式将 YouTube 视频添加到墙贴

    如何在 Facebook 墙中嵌入 YouTube 视频 我尝试使用 源 成员传递视频网址 但没有成功 在检查手动发布的提要的 json 后 我发现 FB 的服务器代码进行了一些处理来实现这一点 提要向我展示了这一点 id 10000146
  • 有没有纯Python的Lucene?

    红宝石人有Ferret https github com dbalmain ferret 有人知道 Python 有类似的计划吗 我们目前使用 PyLucene 但我想研究转向纯 Python 搜索 Whoosh http pypi pyt
  • 将哈希中的一个匹配值替换为另一个值

    我有一个哈希数组 arr key1 gt one key2 gt two key3 gt three key1 gt four key2 gt five key3 gt six key1 gt seven key2 gt eight key
  • 在 pandas 中将月份从数字重命名为名称

    我有以下数据框 High Low Open Close Volume Adj Close year pct day month day 1 1 NaN NaN NaN NaN NaN NaN 2010 0 0 000000 2 7869 8
  • 如何获取 UI 元素的屏幕位置?

    我正在尝试获取 UI 元素的全局位置 我尝试了很多不同的方法来获得这个职位 但似乎都不起作用 问题出在锚点上 因为我移动它们而不是 UI 元素位置本身 出于分辨率目的 检查器中显示的 UI 位置始终为 0 0 0 我还尝试让anchored
  • 为什么精挑细选会导致仓库不稳定? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我不是开发人员 在我们的一个项目中 由于很多门票需要时间才能完成 因此我们一直在挑选我们的提交 现在我们必须经常这样做 一位开发人员告诉我
  • 为什么我的 jquery UI 日期选择器没有默认为英语

    我基本上复制了代码从这里 http jqueryui com demos datepicker 但是当我测试我的网站时我看到了这个 替代文本 http img148 imageshack us img148 8167 datepicker
  • 是否可以在 Action Script 3 中动态创建用户定义类的实例?

    我有一个工厂 其中 Action Script 遵循 xml 并从中构建 DisplayObject 层次结构 这意味着脚本事先并不知道它将在 xml 中遇到哪些元素 因此也不知道它将需要哪些用户定义的工厂类 我知道可以做这样的事情 var
  • Web 部署 - 使用相对路径进行本地文件系统部署

    我想使用 Web 部署来运行自定义部署设置 因为我希望在许多不同的环境 团队成员本地计算机 4 个不同的构建服务器 上运行时都能正常工作 所以我想部署到相对的本地路径 我想做的是 部署到本地relative path 让构建后的步骤做神奇的
  • 扭曲中的持久连接

    我是 Twisted 的新手 有一个问题 如何在 Twisted 中组织持久连接 我有一个队列 每秒都会检查它 如果有一些 发送给客户端 我找不到比每秒调用 dataReceived 更好的方法了 下面是协议实现的代码 class Sync
  • 同构镜片

    我对 van Laarhoven 的一个小例子感兴趣同构透镜 http twanvl nl blog haskell isomorphism lenses 应用于像这样的数据类型data BValue BValue Float Float
  • android:smoothScrollToPosition()无法正常工作

    在将元素添加到与列表视图关联的数组适配器后 我试图平滑地滚动到列表的最后一个元素 问题是它只是滚动到随机位置 arrayadapter add item DOES NOT WORK CORRECTLY listview smoothScro
  • 如何在tensorflow keras中使用CRF?

    代码是这样的 import tensorflow as tf from keras contrib layers import CRF from tensorflow import keras def create model max se
  • 在Python中从url下载csv.gz文件

    我在从网址下载 csv gz 文件时遇到问题 我在下载 tar gz 文件时没有问题 对于 csv gz 文件 我可以提取 gz 文件并读取我的 csv 文件 如果我可以使用 URL 而不是事先拥有 csv 1 0 csv gz 那就很方便
  • 为 UIBarButtonItem 设置图像 - 图像拉伸

    当我尝试使用 UIBarButtonItem 的 initWithImage 来初始化导航栏自定义图像时 它会被冲破并拉伸到黑色导航栏上 这就是我创建它的方式 UIBarButtonItem button UIBarButtonItem a
  • 警告:为 foreach() 提供的参数无效

    results mysql query select from classpics foreach results as uno echo td valign middle align center a class neutral href
  • Linux中使用的offsetof

    我正在研究如何在给定结构中找到特定变量的偏移量 我尝试了以下程序 struct info char a int b char c int d struct info myinfo int main int argc char argv st
  • 缓存URL内容

    我有一个非常简单的用例 当远程端的内容发生变化时 例如 当 上次修改 发生变化时 通过正确和自动重新加载来缓存 URL 的内容 我怎样才能在Java中做到这一点 注意 我的类路径上有 spring guava 和 commons lang3
  • 从 ABC 和 django.db.models.Model 继承会引发元类异常

    我正在尝试使用Python 3实现一个Django数据模型类 它也是一个接口类 我这样做的原因是 我正在为我的同事编写一个基类 并且需要他全部实现三个方法他从我的课程中派生出来的 我试图为他提供一种简化的方式来使用我设计的系统的功能 但是