Django的。为什么我不能将参数从抽象模型类传递给子模型字段?

时间:2016-05-19 09:27:27

标签: python django django-models

我有很多名为state的相同字段的类,CharField有选择权。所有这些类都继承自一个抽象类。我决定将选择变量放到这个抽象类中:

class UsefullAbstractClass(models.Model):
    NEW = 'new'
    ACTUAL = 'actual'
    DELETE = 'delete'

    STATE_CHOICES = (
        (NEW, 'new'),
        (ACTUAL, 'actual'),
        (DELETE, 'delete'))

    class Meta:
        abstract = True

这是我的孩子班:

ChildClass(UsefullAbstractClass):
    state = models.CharField(
            max_length=100,
            choices=STATE_CHOICES)

我得到了

  

姓名' STATE_CHOICES'未定义

然后我使用manage.py shell检查此变量是否存在。所有子类实例都有这个变量

>>> c = ChildClass.objects.all()
>>> c[0].STATE_CHOICES
(('new', 'new'), ('actual', 'actual'), ('delete', 'delete'))

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

ChildClass(UsefullAbstractClass):
    state = models.CharField(
            max_length=100,
            choices=UsefullAbstractClass.STATE_CHOICES)

类定义中定义的变量是类变量;它们由所有实例共享。要创建实例变量,可以使用self.name = value在方法中设置它们。类和实例变量都可以通过符号self.name访问。

您可以使用self.STATE_CHOICES等ChildClass的任何方法访问它。 这就是为什么它适用于c[0].STATE_CHOICES

因此只能通过实例(self.variable_name)访问它。如果您想在方法之外访问它,那么您应该class.variable_name

有关详细信息,请查看链接http://docs.python.org/reference/compound_stmts.html#class-definitions