Как отобразить логическое свойство в администраторе django

Как мы все знаем, отображение возвращаемого значения метода в качестве логического элемента в администраторе Django легко выполняется установкой атрибута boolean:

class MyModel(models.Model):
    def is_something(self):
        if self.something == 'something':
            return True
        return False
    is_something.boolean = True

Как вы можете добиться такого же эффекта для свойства, как в следующем случае?

class MyModel(models.Model):
    @property
    def is_something(self):
        if self.something == 'something':
            return True
        return False

Ответ 1

Ожидая появления лучших решений, я решил это следующим образом:

class MyModel(models.Model):
    def _is_something(self):
        if self.something == 'something':
            return True
        return False
    _is_something.boolean = True
    is_something = property(_is_something)

Затем я ссылаюсь на метод _is_something в подклассе ModelAdmin:

class MyModelAdmin(admin.ModelAdmin):
    list_display = ['_is_something']

И свойство is_something иначе:

if my_model_instance.is_something:
    print("I'm something")

Ответ 2

это самый простой способ, который я нашел, непосредственно в ModelAdmin:

class MyModelAdmin(admin.ModelAdmin):
    def is_something(self, instance):
        return instance.something == "something"
    is_something.boolean = True
    is_something.short_description = u"Is something"

    list_display = ['is_something']

Ответ 3

Если вы определяете is_something как свойство, он будет неизменным объектом, а не функцией, но этот объект содержит ссылку на украшенный геттер в атрибуте fget. Я думаю, что интерфейс администратора Django использует getter этого свойства, поэтому это может работать

class MyModel(models.Model):
    @property
    def is_something(self):
        if self.something == 'something':
            return True
        return False
    is_something.fget.boolean = True