繁体   English   中英

从其他字段计算的 Django 模型字段

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM