django. how can i do some math in model

i'm trying to migrate from php to django, for my study project. User can create 3 variables such as minimal value, maximal value and step for this value. from it i 'm generate list, and then i'm trying to do some math and results render as table, but can't understend how to do it right. This is my scary prototype code on python:

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)))

in result it's create matrix 12x37, like so:

    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, 
    .....

And this is my model where im trying to use it

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)

So how can i put my code for generate matrix(i know it's a mess) in my model, and how to do it right? Probably i need create some filters in app.

1 answer

  • answered 2018-11-08 02:51 ruddra

    If you are using PostgreSql as Database, then you can use ArrayField in which you can directly store your array after calculation. For example:

    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)