簡體   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