[英]Django Model field calculated from other fields
这里还有很多其他问题,但没有一个有帮助。
我想一个yield
至通过下式计算字段yield = starts / finishes
字段。 我想用 Highcharts 绘制它。
但是,当我通过管理门户添加对象时 - 它设置了yield = 0
并且不会计算。
模型.py:
class wYield(models.Model):
starts = models.PositiveIntegerField(default=0)
finishes = models.PositiveIntegerField(default=0)
## ONE: i've tried the below:
yield_num = model.FloatField()
def save(self, *args, **kwargs):
if self.starts > 0:
self.yield = self.finishes / self.starts
else:
self.yield = 0
super(wYield, self).save(*args, **kwargs)
## TWO: i've tried this but then I don't know how to see it in the Admin view:
def _set_yield(self):
if self.starts > 0:
x = self.finishes / self.starts
else:
x = 0
return x
yield_num = property(_set_yield)
## THREE: I think this works the same as TWO
@property
def yield_num(self):
if self.starts > 0:
return self.finishes / self.starts
else:
return 0
管理.py:
from .models import wYield
class wYieldAdmin(admin.ModelAdmin):
list_display = ('starts', 'finishes', 'yield_num')
admin.site.register(wYield, wYieldAdmin)
想通了(在 AbhiP 的帮助下!)Python int
类型转换是罪魁祸首。 愚蠢的问题!
以下是有效的,并允许我不保存计算字段(但显示它并使其像模型中的字段一样):
@property
def yield_num(self):
if self.starts > 0:
#needed the float() to cast it out of an int
return self.finishes / float(self.starts)
else:
return 0
也许您不必每次都将它保存在数据库中,因为它可以即时计算; 否则你会浪费空间。 更不用说 db 值的重复性了。
此外,如果明天您的逻辑更改为yield
您将完全自由地对您的lambda
表达式进行更改。 下面是一个例子:
Class wYieldAdmin(admin.ModelAdmin):
yield = lambda self: (self.finishes / self.starts) if self.starts > 0 else 0
yield.short_description = 'Yield'
list_display = ('starts', 'finishes', 'yield')
Class wYieldAdmin(admin.ModelAdmin):
yield = lambda self: (self.finishes / self.starts) if self.starts > 0 else 0
yield.short_description = 'You have a big head'
list_display = ('starts', 'finishes', 'yield')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.