[英]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.