我正在逐步用基于django的系统替换旧数据库前端。所有模型都是Managed = False,以保留原始数据库结构。
但是我遇到了计算表中字段的问题。该字段在(伪)sql中定义为full_name = fname || || L-NAME。
我可以将full_name字段定义为charfield;并且我可以读它没有问题,但是任何更新记录的尝试都会导致该字段的更新错误。
我可以使用@property;但是它复制了django中的功能,而不是显示db本身的结果。使用这种方法会导致使用UDF定义的更复杂字段(在我尚未获得的表中)出现问题。
真正需要的是模型本身的'read_only'或'computed'属性;实现这一目标的最佳方法是什么?
答案 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% 的计算。我希望这对你有用,正如我所说的就像他们为我工作一样,干杯。