python - Django 。我怎样才能在模型中做一些数学运算

标签 python django

我正在尝试从 php 迁移到 django,用于我的学习项目。用户可以创建 3 个变量,例如最小值、最大值以及该值的步长。我从中生成列表,然后我尝试做一些数学运算并将结果呈现为表格,但无法理解如何正确执行。这是我在 python 上的可怕原型(prototype)代码:

import numpy as np

mcharge = np.arange(0.01, 0.38, 0.01)
charge = np.arange(20, 57, 1)
mdiscount = np.arange(0.001, 0.013, 0.001)
discount = np.arange(5, 23, 1.5)

clist = charge.tolist()
mlist = mcharge.tolist()
mdlist = mdiscount.tolist()
dlist = discount.tolist()


result_sum_n_m_n = [(x + y) / 100 for x,y in zip(charge, margin)]
result_sum_s_m_s = [(x + y) / 100 for x,y in zip(mdiscount, discount)]
result_sum_a = [ '%.4f' % elem for elem in result_sum_n_m_n ]
result_sum_b = [ '%.4f' % elem for elem in result_sum_s_m_s ]
n_m_n = result_sum_a * 12
n_m_n.sort()
s_m_s = result_sum_b * 37

n_m = [float(i) for i in n_m_n]
s_m = [float(i) for i in s_m_s]

multiply = [(x * y) for x,y in zip(n_m, s_m)]
minus = [(x- y) for x, y in zip(n_m, s_m)]

last_minus = [(x - y) for x, y in zip(minus, multiply)]
con = [(x / y) for x, y in zip(n_m, last_minus)]
print('result {}, len {}'.format(con, len(con)))

结果创建了 12x37 矩阵,如下所示:

    1.4283164995181838, 1.6389078861692066, 1.9223379318295355, 2.3242982675208066, 2.9439896046711893, 4.004603793386458, 6.259777970274032, 14.329202140572251, -49.56638700424323, -9.079561186305252, -4.997501249375312, -3.4475326365561463, 
    1.4042354198677265, 1.5980294517892306, 1.8538770902420096, 2.2072644412008695, 2.7313961644544786, 3.574587978568797, 5.170847049689823, 9.343061021478366, 48.37766802148688, -15.223037046585988, -6.5767613173797335, -4.194435010402278, 
    .....

这是我的模型,我正在尝试使用它

class Margin(models.Model):
 minimal = models.DecimalField()
 maximal = models.DecimalField()
 step = models.DecimalField()

 def gen_range_margin(self):
   margin = np.arange(self.minimal, self.maximal, self.step)
   return margin

class Charge(models.Model):
   minimal = models.DecimalField()
   maximal = models.DecimaField()
   step = models.DecimaField()

   def gen_range_charge(self):
      charge = np.arange(self.minimal, self.maximal, self.step)
      return charge
.......
.......
class Calculus(models.Model):
  product = models.OneToOneField(Product)
  margin = models.OneToOneField(Margin)
  charge = models.OneToOneField(Charge)
  mdiscount = models.OneToOneField(Mdiscount)
  discount = models.OneToOneField(Discount)

那么我如何将生成矩阵的代码(我知道这是一团糟)放入我的模型中,以及如何正确执行?也许我需要在应用程序中创建一些过滤器

最佳答案

如果您使用 PostgreSql 作为数据库,那么您可以使用 ArrayField您可以在其中直接存储计算后的数组。例如:

class Margin(models.Model):
    ...
    @property
    def gen_range_margin(self):
       margin = np.arange(self.minimal, self.maximal, self.step)
       return margin

class Charge(models.Model):
    ...
    @property
    def gen_range_charge(self):
        charge = np.arange(self.minimal, self.maximal, self.step)
        return charge

from django.contrib.postgres.fields import ArrayField

class Calculus(models.Model):
    result = ArrayField(ArrayField(models.DecimalField()))
    ...
    def do_the_math(self):
        # your calculation
        self.result = result_as_array

    def save(self, *args, **kwargs):
         self.do_the_math()
         return super(Calculus, self).save(*args, **kwargs)

关于python - Django 。我怎样才能在模型中做一些数学运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53199834/

相关文章:

python - 如何省略数组中的某些值

python - 如何使用最新版本的 Pandas 进行 OLS 回归

python - 解析 iPhone App Store RSS XML

django - Django 中的条件嵌套过滤器

python - 根据django的选择从数据库中获取数据

javascript - Flask:不要重定向到 url()

Python os.listdir() 不断跳过某些文件?

python - Django-Tinymce导入报错

Debug=False 中不存在 url 的 Django 500 错误

由于 key 中包含 "!",Django SECRET_KEY 错误