DJANGO模型代理继承

时间:2015-04-05 12:57:14

标签: python django django-models

我想为我的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(....))

2 个答案:

答案 0 :(得分:0)

如果您希望MapAMapB(如果您遵循PEP-8会非常有帮助)成为不同的模型,代理模型将无法帮助您。代理模型是Python中不同的模型,但在数据库中它与它继承的模型完全相同。创建一个不直接从单个具体模型继承的代理模型(在数据库中有一个表)是一个错误。

您正在寻找的是一个抽象基类:

class Tools(models.Model):
    ...

    class Meta:
        abstract = True

class MapA(Tools):
    ...

class MapB(Tools):
    ...

抽象模型在数据库中创建自己的表。相反,好像Tools中定义的所有内容都已在MapAMapB中定义,但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代理模型。