首页 > 解决方案 > 有没有更好的方法在 Django admin 中显示来自 Django 模型的附加信息

问题描述

有没有更好的方法通过将“CONN”移动到仍然可以使用但只需要编写一次的地方来减少代码的重复性。所以我仍然可以在 django admin 的相同字段中显示相同的信息。

当我将“CONN”移动到其他地方时,该功能停止工作。并显示错误。

模型.py

from .connection import HostConn

class Host(models.Model):
    name = models.CharField(max_length=20)
    hostname = models.CharField(max_length=20)
    login = models.CharField(max_length=20)
    password = models.CharField(max_length=14, blank=True, null=True)
    conntype = models.CharField(max_length=7, choices=CONN_SELECT)

    def __str__(self):
        return self.name

    def status(self):
        conn = HostConn(self.hostname, self.login, self.password, self.conntype)
        status = conn.host_up()
        return status

    def cpu(self):
        conn = HostConn(self.hostname, self.login, self.password, self.conntype)
        return conn.get_host_info()[0]

    def memory(self):
        conn = HostConn(self.hostname, self.login, self.password, self.conntype)
        return conn.get_host_info()[1]

    def free_memory(self):
        conn = HostConn(self.hostname, self.login, self.password, self.conntype)
        return conn.get_host_info()[2]

管理员.py

class HostAdmin(admin.ModelAdmin):
    list_display = ('name', 'hostname', 'conntype', 'status', 'cpu', 'memory', 'free_memory', 'options')

标签: pythondjangodjango-models

解决方案


property你可以在你的Host模型上定义一个:

from .connection import HostConn

class Host(models.Model):
    name = models.CharField(max_length=20)
    hostname = models.CharField(max_length=20)
    login = models.CharField(max_length=20)
    password = models.CharField(max_length=14, blank=True, null=True)
    conntype = models.CharField(max_length=7, choices=CONN_SELECT)

    def __str__(self):
        return self.name

    @property
    def conn(self):
        return HostConn(self.hostname, self.login, self.password, self.conntype)

    def status(self):
        return self.conn.host_up()

    def cpu(self):
        return self.conn.get_host_info()[0]

    def memory(self):
        return self.conn.get_host_info()[1]

    def free_memory(self):
        return self.conn.get_host_info()[2]

有关属性的更多信息,请参见此处

如果您担心对该conn函数进行不必要的多次调用,您可以使用lru_cache例如来记忆它。有关更多信息,请参阅Python 文档的这一部分


推荐阅读