Django模型中如何在新属性内调用已有属性实现求和?
解决ConsElect模型中新增求和属性的问题
先修正原代码里的几处错误,再实现求和属性:
修正后的完整代码
from django.db import models import datetime class ConsElect(models.Model): pgd = models.ForeignKey(TipoPGD, on_delete=models.CASCADE, related_name='consumoelect') data = models.DateField(default=datetime.now) read_morning = models.IntegerField(default=0) read_day = models.IntegerField(default=0) # 补全缺失的字段定义 def get_rm(self): # 获取下一条记录的早晨读数,计算差值 next_records = ConsElect.objects.filter(data__gt=self.data).values('read_morning')[:1] if next_records: return next_records[0]['read_morning'] - self.read_morning return 0 # 处理无后续记录的情况,避免索引报错 cons_m = property(get_rm) def get_rd(self): # 获取下一条记录的日间读数,计算差值 next_records = ConsElect.objects.filter(data__gt=self.data).values('read_day')[:1] if next_records: return next_records[0]['read_day'] - self.read_day return 0 # 处理无后续记录的情况 cons_d = property(get_rd) def get_total(self): # 调用已定义的实例属性求和 return self.cons_m + self.cons_d cons_total = property(get_total)
关键说明
- 调用属性的正确方式:求和时必须通过
self.cons_m、self.cons_d调用,因为这两个是绑定到实例的属性,直接写cons_m会被当成局部变量报错。 - 修复原代码问题:补全了
read_day字段的完整定义,修正了get_rm中字典键名的多余空格,调整了cons_m、cons_d的缩进(必须放在对应get函数外面作为类属性)。 - 异常处理:增加了无后续记录的判断,避免出现索引越界错误。
内容的提问来源于stack exchange,提问作者Julio Cesar Sori Gomez
相关产品推荐
相关产品推荐

