创建一个简单的 python 计算以在特定对象记录的管理面板中显示

Posted

技术标签:

【中文标题】创建一个简单的 python 计算以在特定对象记录的管理面板中显示【英文标题】:Creating a simple python calculation to show in the admin panel on a specific object record 【发布时间】:2019-11-09 01:36:29 【问题描述】:

我是 python 的新手,正在开发一个新的 django 项目,并希望使用记录数据在管理面板中显示特定记录的计算。这也将在用户界面上复制(尚未构建)。

我已经学习了变量的基本存储和操作,以用于根据基本用户输入进行的其他计算。这有点不同,因为它是在管理面板中完成的。我正在使用 PyCharm,但 PyCharm 告诉我有错误。我还使用此处的链接来查看是否可以使其正常工作:

https://www.reddit.com/r/django/comments/6xigr3/how_to_show_calculated_field_in_django_admin/

我意识到下面的代码不正确,但我也不确定我是否正确引用了变量以从主函数中访问它们?

在管理面板与用户界面中使用时,定义此功能有何变化?

感谢您对上述任何问题的任何帮助!

# Create a class to calculate the volume by first converting inches to ft, then to cubic yd
class Volume(models.Model):
    linear_ft = models.DecimalField('Length in feet: ', max_digits=200, decimal_places=2)
    depth_in = models.DecimalField('Depth in inches: ', max_digits=200, decimal_places=2)
    width_in = models.DecimalField('Width in inches: ', max_digits=200, decimal_places=2)

    # Convert inches to feet, store variables for use in future functions
    def in_to_ft(self):
        depth_ft = self.depth_in * 12
        width_ft = self.width_in * 12

    # Call to get cubic yards which uses variables from previous functions
    def get_cu_yd(self):
        dims = str(self.linear_ft) + " length x " + str(self.depth_ft) + " depth x " + str(self.width_ft) + " width")
        cubic_ft = self.linear_ft * self.depth_ft * self.width_ft
        cubic_yd = cubic_ft * 0.037037

        return cubic_yd + "cubic yards: " + str(self.dims)

    # Register the function to the property method
    obj_cu_yd = property(get_cu_yd)

def __str__(self):
    return obj_cu_yd

我想接受用户输入(可能是小数),将英寸转换为英尺,通过乘以长度 (ft) x 宽度 (ft) x 深度 (ft) 来计算立方英尺并存储一个 'string ' 版本以显示对象的尺寸。 str(self) 应该返回立方码和描述对象尺寸的字符串。

::更新:: 我已经走到这一步了:

# Create a class to calculate the volume by first converting inches to ft, then to cubic yd

类卷(models.Model): 名称 = models.CharField(max_length=200) linear_ft = models.DecimalField('长度以英尺为单位:', max_digits=200, decimal_places=2, default=0) depth_in = models.DecimalField('以英寸为单位的深度:', max_digits=200, decimal_places=2, default=0) width_in = models.DecimalField('宽度英寸:', max_digits=200, decimal_places=2, default=0)

# Create empty variables so not to divide/multiply by nonzero
cubic_ft = 0
cubic_yd = 0

# Set conversion rate from ft to yards
cubic_ft_yd = 0.037037

# Call to get cubic yards
def get_cu_yd(self):
    depth_ft = decimal.Decimal(self.depth_in) * 12
    width_ft = decimal.Decimal(self.width_in) * 12
    dims = str(self.linear_ft) + " length x " + str(depth_ft) + " depth x " + str(width_ft) + " width"
    cubic_ft = decimal.Decimal(self.linear_ft)*depth_ft*width_ft
    cubic_yd = cubic_ft*self.cubic_ft_yd

    return str(self.name) + " - " + str(cubic_yd) + "cubic yards: " + dims

# Register the function to the property method
obj_cu_yd = property(get_cu_yd)

def str(自我): 返回 obj_cu_yd

现在我的问题是这个错误: 不支持的操作数类型:“decimal.Decimal”和“float” 参考cubic_yd =cubic_ftself.cubic_ft_yd

提前致谢

【问题讨论】:

【参考方案1】:

您不应该这样设置depth_ftwidth_ft。您需要改为设置self.depth_ft = self.depth_in * 12,以便变量实际注册为实例的成员。

事实上,你根本不应该有那个辅助函数。

def get_cu_yd(self):
        depth_ft = self.depth_in * 12
        width_ft = self.width_in * 12
        dims = str(self.linear_ft) + " length x " + str(depth_ft) + " depth x " + str(width_ft) + " width")
        cubic_ft = self.linear_ft * depth_ft * width_ft
        cubic_yd = cubic_ft * 0.037037

        return dims + "cubic yards: " + str(self.dims)

【讨论】:

当我这样做时,我得到一个错误:TypeError at /admin/formulas/volume/add/ unsupported operand type(s) for *: 'NoneType' and 'int'。我认为这与创建实例之前没有值的 Volume 变量有关吗?例如,是否需要在记录第一条记录之前放置一个空值。 IE。有一个空列表或其他什么? @AlexanderDing 你最后的评论不正确,self.linear_ft 会给你价值。 @KevinW 你应该给你的字段default=0 属性。 谢谢@DanielRoseman -- 我必须添加 import decimal,然后添加 decimal.Decimal(self.depth) * 12 (例如,在这一行),我必须在其他人身上这样做清除错误。现在我在cubic_yd变量上有它并且得到一个错误:不支持的操作数类型*:'decimal.Decimal'和'float'

以上是关于创建一个简单的 python 计算以在特定对象记录的管理面板中显示的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - 触发器以在更新时创建历史记录行

Oracle - 授予非 dba 用户权限以在另一个用户对象上创建授权

提取 csv 文件特定列以在 Python 中列出

SQL 创建触发器以在特定条件下更新表

云计算Python自动化:内部的引用计数

创建一个循环以在同一行中记录下一个记录时间和日期(基于唯一 ID)