2013-05-14 2 views
2

Возможно ли установить свойство в django (для обратной совместимости) без соответствующего поля? Вот простой тест с пользовательской моделью пользователя:Свойство модели Django без поля

class CustomUser(AbstractBaseUser): 
    email = models.EmailField(max_length=254, unique=True, db_index=True) 
    USERNAME_FIELD = 'email' 
    ... 
    permissions = models.IntegerField(default=0) 

    @property 
    def is_staff(self): 
    return self.permissions >= 2 
    @is_staff.setter 
    def is_staff(self, value): 
    if value and not self.is_staff: 
     self.permissions = 2 
    if not value and self.is_staff: 
     self.permissions = 1 

Теперь, когда я пытаюсь загрузить этот пользователь с помощью интерфейса администратора по умолчанию, я получаю следующее сообщение об ошибке: 'CustomUserAdmin.list_filter[0]' refers to 'is_staff' which does not refer to a Field.

Есть ли способ, чтобы установить это так, что модель обеспечивает is_staff как функцию другого поля?

ответ

5

Это вполне возможно, и код, который вы указали, сам по себе не вызовет никаких проблем. Проблема возникает только потому, что вы пытались использовать это свойство в admin list_filter, чего вы не можете сделать, потому что, как и любая фильтрация, которая переводится в db-запрос, для этого требуется фактическое поле db.

+0

ОК, подумал, что это будет так. В этом примере было бы проще редактировать администратора, но есть ли способ обхода, который я мог бы использовать для предоставления 'is_staff', чтобы изменения в' is_staff' и 'permissions' задавали оба поля правильно? – kai

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