Django,Python继承:从超类中排除一些字段

时间:2017-03-17 14:39:45

标签: python django inheritance

我在Employee和Manager类之间有继承。员工 - 超类,经理 - 子类。

class Employee(models.Model):
    ###
    name = models.CharField(max_length=50, null=False)
    address = models.CharField(max_length=50, null=False)
    ###

class Manager(Employee):
    department = models.CharField(max_length=50)
    ###
    here I don't want the 'name' and 'address' fields of Employee class.
    (I want other fields of Employee and department field of this class to be stored in 
    Manager table in database)
    ###

怎么能实现这一目标。提前谢谢。

2 个答案:

答案 0 :(得分:6)

我使用3个课程:

class BaseEmployee(models.Model):
    # All your common fields

class Employee(BaseEmployee):
    name = models.CharField(max_length=50, null=False)
    address = models.CharField(max_length=50, null=False)

class Manager(BaseEmployee):
    department = models.CharField(max_length=50)

我认为这可以达到你想要的效果。

答案 1 :(得分:4)

您可以使用2个下划线(__)在python类中创建私有变量,查看this示例以获取更多信息。

然而,他们会将这些值存储在子对象中,因为在Python中没有私有或受保护的东西。

但另一种方法可以用于Django。在Django中,模型字段的存储取决于它们的值(CharFieldDateField等),但是如果您要设置项值None或任何其他静态值(例如"string" }),这应该可以解决你的问题:

class Manager(Employee):
  name = None
  address = None
  # other_stuffs.

在该示例中,Manager不应该在数据库中包含名称和地址列,当您尝试访问它们时,您将获得None。如果你想获得AttributeError(Django提出当对象没有请求密钥时),那么你也可以添加属性:

class Manager(Employee):
  name = None
  @property
  def name(self):
    raise AttributeError("'Manager' object has no attribute 'name'")