Django 表格解释'';在def保存中为0。重构我的解决方案

Django 表格解释'';在def保存中为0。重构我的解决方案,django,Django,我有所有这些无线电组和模型中的真假复选框。如果未选中复选框或未选择单选组中的按钮,则表单将发布“”。我正在将表单的所有值相加,并希望将空字符串解释为0。所以我重写了save函数 模型代码中的save基本上如下所示 def save(self, *args, **kwargs): self.cei_total = 0 self.aggbs_total = 0 ceis = [self.cei_0,self.cei_1,self.cei_2,self.cei_3,self.c

我有所有这些无线电组和模型中的真假复选框。如果未选中复选框或未选择单选组中的按钮,则表单将发布“”。我正在将表单的所有值相加,并希望将空字符串解释为0。所以我重写了save函数

模型代码中的save基本上如下所示

def save(self, *args, **kwargs):
    self.cei_total = 0
    self.aggbs_total = 0
    ceis = [self.cei_0,self.cei_1,self.cei_2,self.cei_3,self.cei_4,self.cei_5,self.cei_6,self.cei_7,self.cei_8,self.cei_9,self.cei_10,self.cei_11,self.cei_12,self.cei_13,self.cei_14,self.cei_15 ]
    for c in ceis:
        if c != '':
            self.cei_total += 1
    aggbss = [self.aggbs_0, self.aggbs_1, self.aggbs_2, self.aggbs_3, self.aggbs_4, self.aggbs_5, self.aggbs_6, self.aggbs_7]
    for a in aggbss:
        if a != '':
            self.aggbs_total += a # it's a radio group, a could be 1,2,3,4 if not ''
    # And so on...
    super(Survey, self).save(*args, **kwargs)
其中cei_0-15是布尔字段或字符字段。和aggbs_0-7是积极的综合性领域


必须有更好的方法来做到这一点。

这里有一种方法:

self.cei_total = sum(1 for value in ceis if value)
self.aggbs_total = sum(value for value in aggbss if value)
此外,您可以使用
getattr()
,而不是定义这些
cei
aggbss
列表,如下所示:

ceis = (getattr(self, field) for field in self._meta.fields 
        if field.name.startswith('cei_'))
print sum(1 for value in ceis if value)

如何从
getattr(self,item)
中提取求和的值?对于以10为基数的int(),仍然得到
无效的文本:“”
@broinjc请参阅更新的答案。在
aggbs
的情况下,您应该将值强制转换为
int
打印总和(对于ceis中的值,int(value)如果值)
@broinjc hm,为什么用空字符串调用
int
,它应该由
if value
过滤掉。我使用的是ModelForm…从调试的外观来看,值是
u'
自我值u'