我想为我的django模型calss添加'tools'类的方法。 每个类都将使用与其自己的模型相同的方法:
class mapA(models.Model):
mInd = models.IntegerField()
scId = models.IntegerField()
class mapB(models.Model):
mInd = models.IntegerField()
scId2 = models.IntegerField()
我想将checkInput()等方法添加到它们中。 所以我可以跑:
mapBInstance.checkInput();
mapAInstance.checkInput();
ech time checkInput运行mapA或mapB中的数据。
我想过要创建一个工具类&让每个模型继承它。 这样,工具类将具有与两个映射相同的逻辑。
当我读到django docs时,我没有看到这种情况的例子只有接近的解决方案。 这是正确的解决方案(使用代理类)吗?
class Tools():
def __init__():
...init class...
def checkInput():
..make the checks..
class MapA(Tools, models.Model):
mInd = models.IntegerField()
scId = models.IntegerField()
def checkSelf():
self.checkInput(self.objects.filter(....))
class MapB(Tools, models.Model):
mIndB = models.IntegerField()
scIdB = models.IntegerField()
def checkSelf():
self.checkInput(self.objects.filter(....))
答案 0 :(得分:0)
如果您希望MapA
和MapB
(如果您遵循PEP-8会非常有帮助)成为不同的模型,代理模型将无法帮助您。代理模型是Python中不同的模型,但在数据库中它与它继承的模型完全相同。创建一个不直接从单个具体模型继承的代理模型(在数据库中有一个表)是一个错误。
您正在寻找的是一个抽象基类:
class Tools(models.Model):
...
class Meta:
abstract = True
class MapA(Tools):
...
class MapB(Tools):
...
抽象模型不在数据库中创建自己的表。相反,好像Tools
中定义的所有内容都已在MapA
和MapB
中定义,但Tools
类被忽略。这允许您只指定一次所有方法和字段,但在数据库中仍然有两个单独的表。
答案 1 :(得分:0)
一些事情......
Python中没有this
,它被称为self
。
如果您使用的是Python 2.x,tools
应该继承自object
。在Python 3中,它是隐含的,但并不会造成伤害:
class tools(object):
...
如果您在mixin类(__init__
)中覆盖tools
,那么map
类可能应该首先从继承:
class mapA(tools, models.Model):
...
如果你真的需要,只覆盖__init__
,它会变得复杂。
类名几乎总是在CamelCase中。这不是必需的,但是一种惯例。另外,透明地命名mixin类是个好主意:
class ToolsMixin(object):
...
class MapA(ToolsMixin, models.Model):
...
除此之外,您完全可以在mixin中添加方法并在模型中使用它。不需要Django代理模型。