2016-05-19 4 views
1

У меня есть много классов с одинаковым полем с именем state, которое равно CharField с вариантами. И все эти классы наследуются от одного абстрактного класса. Я решил поставить выбор переменных для этого абстрактного класса:Django. Почему я не могу передать параметр из класса абстрактной модели в дочернюю модель?

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')) 

Как решить эту проблему?

+0

вы можете определить состояние поля в 'UsefullAbstractClass' вместо' ChildClass' – Pavan

+0

@Pavan да я могу, но в некоторых других моделях я разные для государства всячески манипулировать, и хотите просто переопределить эту переменную. И я хочу понять, почему этот наследователь не работает в поле, но я вижу эту переменную во всех экземплярах этого класса. –

ответ

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

Переменные, определенные в определении класса, являются переменными класса; они разделяются всеми экземплярами. Чтобы создать переменные экземпляра, они могут быть установлены в методе с именем self.name =. Переменные класса и экземпляра доступны через нотацию self.name.

Доступ к ней можно получить любыми методами ChildClass, например self.STATE_CHOICES. Именно поэтому он работал для c[0].STATE_CHOICES

Таким образом, он доступен только с экземплярами (self.variable_name). Если вы хотите получить доступ к нему за пределами методов, вы должны сделать class.variable_name.

Для получения более подробной информации, пожалуйста, проверьте ссылку http://docs.python.org/reference/compound_stmts.html#class-definitions

+0

Thank. Он работает, но я действительно хочу понять, почему я не могу просто использовать 'STATE_CHOICES'. Если вы можете объяснить, это будет хорошо –

+1

Потому что он определен в ПолезномAbstractClass. –

+0

@ Анооп, большое спасибо за подробный ответ! –

Смежные вопросы