Python 根据其他字段计算的Django模型字段
围绕这一点,还有很多其他问题,但没有一个能起到作用 我希望通过Python 根据其他字段计算的Django模型字段,python,django,django-models,django-admin,Python,Django,Django Models,Django Admin,围绕这一点,还有很多其他问题,但没有一个能起到作用 我希望通过yield=start/finished字段计算yield字段。我想用海图把它画出来 但是,当我通过管理门户添加对象时,它的设置是yield=0,并且不会计算 models.py: class wYield(models.Model): starts = models.PositiveIntegerField(default=0) finishes = models.PositiveIntegerField(defau
yield=start/finished
字段计算yield
字段。我想用海图把它画出来
但是,当我通过管理门户添加对象时,它的设置是yield=0
,并且不会计算
models.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
admin.py:
from .models import wYield
class wYieldAdmin(admin.ModelAdmin):
list_display = ('starts', 'finishes', 'yield_num')
admin.site.register(wYield, wYieldAdmin)
也许你不必每次都把它保存在db上,因为它可以动态计算;否则你会浪费空间。更不用说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')
找到了答案(在AbhiP的帮助下!)Pythonint
typecasting是罪魁祸首。愚蠢的问题
以下是有效的方法,允许我不保存计算字段(而是显示它并使其与模型中的字段类似):
请你用更详细的解释来扩展你的答案好吗?这对理解非常有用。非常感谢。
@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
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')