Django和遗留数据库中的计算字段

时间:2011-08-13 11:55:07

标签: django models readonly

我正在逐步用基于django的系统替换旧数据库前端。所有模型都是Managed = False,以保留原始数据库结构。

但是我遇到了计算表中字段的问题。该字段在(伪)sql中定义为full_name = fname || || L-NAME。

我可以将full_name字段定义为charfield;并且我可以读它没有问题,但是任何更新记录的尝试都会导致该字段的更新错误。

我可以使用@property;但是它复制了django中的功能,而不是显示db本身的结果。使用这种方法会导致使用UDF定义的更复杂字段(在我尚未获得的表中)出现问题。

真正需要的是模型本身的'read_only'或'computed'属性;实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

您是否只想在班级中定义方法?类似的东西:

def Person(models.Model):
  fname=models.CharField(...)
  lname=models.CharField(...)

  def fullname(self):
     return self.fname+" "+self.lname

(不完全确定Managed = False意味着......)

答案 1 :(得分:0)

  if you are trying to make calculation on a database models and pass the value of a model field to another model field of the same class model, using a defined function then this solution might help you. for example lets assume you have an investment company and you give 20% per month for the capital each user invested, you would want  want to pass value from capital model to a function that calculates the percentage interest, and then you will pass that function into another field monthly_payment and get saved in the database. 
    1) pip install django-computed-property 
    2) add 'computed_property' to your installed apps in project settings. 
    3) in your models.py, import computed_property then

类投资(models.Model):

    name = models.CharField(max_length=200)
    capital = models.FloatField(null=False)

    percentage = models.CharField(max_length=5)
    duration = models.CharField(max_length=10, default="1 months")

    monthly_payment = computed_property.ComputedFloatField( compute_from='monthly_percentage', null=False, blank=False)

then your function to perform the calculation will go thus 
    @property
    def monthly_percentage(self):
        return (20 / 100) * self.capital 

注意:我发现如果你使用内置的 django 字段,无论是 FloatFiled 还是 IntegerField,这个函数都不会读取你传入的数量以获得 20% 的计算。我希望这对你有用,正如我所说的就像他们为我工作一样,干杯。