Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据其他字段计算的Django模型字段_Python_Django_Django Models_Django Admin - Fatal编程技术网

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的帮助下!)Python
int
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')