【问题标题】:How to declare abstract class and methods for model implementation? [duplicate]如何声明模型实现的抽象类和方法? [复制]
【发布时间】:2020-06-25 06:50:16
【问题描述】:

我想知道 Django 中是否有一种方法可以创建一个抽象类,我可以在其中声明一个应该在模型中实现的方法。

通常,在 Python 中,我们这样声明抽象类:

import abc

class MyABC(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def do_something(self, value):
        raise NotImplementedError

然后像这样实现它:

class MyClass(MyABC):

    def do_something(self, value):
        pass

我用 django 做的是:

import abc
from django.db import models

class MyClass(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def __str__(self):
        raise NotImplementedError

class MyClass2(models.Model, MyClass):

    def __str__(self):
        pass

但这给了我错误:

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

我不明白我在这里做错了什么。 MyClass2 应该继承自 MyClassmodels.Model

我做错了什么?为什么这是错误的?声明应该在模型中实现的方法的更好方法是什么?

【问题讨论】:

标签: python django django-models metaclass abstract-methods


【解决方案1】:

对于 django 模型你可以试试这个。

从 django.db 导入模型

class MyClass(models.Model):

   class Meta:
      abstract = True
   def __str__(self):
      raise NotImplementedError

class MyClass2(MyClass):

   def __str__(self):
       pass

请参考this 希望这会有所帮助。

【讨论】:

  • 我读了几次这个页面,但是文档没有提到方法。无论如何,这对我有用。谢谢!也许 Django 文档应该有一个关于如何做到这一点的例子。
  • @macieyn 基本上文档只是明确了概念,这足以理解。 :-)
  • 也许我的英语没有我想的那么好。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2015-02-28
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
相关资源
最近更新 更多