django - 如何在 Django 中的抽象类的子级之间执行计算
问题描述
我正在使用抽象基类在我的模型中执行简单的计算,如下所示:
class Base(models.Model):
name = models.CharField(max_length=100, null=True)
width = models.DecimalField(max_digits=10, decimal_places=2, default=1, validators=[MinValueValidator(1)])
length = models.DecimalField(max_digits=10, decimal_places=2, default=1, validators=[MinValueValidator(1)])
class Meta:
abstract = True
class Room(Base):
room_area = models.DecimalField(max_digits=10, decimal_places=2, default=1, validators=[MinValueValidator(1)])
def save(self, *args, **kwargs):
self.room_area = self.length*self.width
super().save(*args, **kwargs)
def __str__(self):
return self.name
class Hall(Base):
hall_area = models.DecimalField(max_digits=10, decimal_places=2, default=1, validators=[MinValueValidator(1)])
room = models.ForeignKey(Room, on_delete=models.SET_NULL, null=True)
def save(self, *args, **kwargs):
self.hall_area = self.length*self.width
super().save(*args, **kwargs)
def __str__(self):
return self.name
假设我需要找到building_area
等于building_area = room_area + hall_area
。我的问题是building_area
其他模型和子级将使用它Base
(计算其他变量)。我认为如果我进行building_area
in的计算会更好Base
。我是 Python 和 Django 的新手,所以不太清楚如何实现它。有人可以提出解决方案或指出一个很好的例子吗?
解决方案
我的建议是使用子类上的函数来委派这种操作:
我有以下示例:
from django.db import models
from ecommerce.shipping.models import Shipping
class Sea(Shipping):
weight = models.PositiveIntegerField(null=True, default=0)
@property
def value(self):
return self.cost * self.weight
class Ground(Shipping):
weight = models.PositiveIntegerField(null=True, default=0)
@property
def value(self):
return self.cost * self.weight
class Air(Shipping):
weight = models.PositiveIntegerField(null=True, default=0)
@property
def value(self):
return self.cost * self.weight
您可以适应自己的代码,但是拥有这种子类,您可以轻松处理以进行计算
self.sea = Sea(weight=10, cost=2)
如果我们调用sea.value
结果将是20
因为
return self.cost * self.weight
推荐阅读
- javascript - IE 和 Edge 的 Nuxt.js 站点 javascript 问题。CSV 数据未加载
- python - 熊猫 read_csv。行终止符出现在字符串中
- r - 具有多索引的面板数据
- javascript - 更新 React 状态数组中的布尔值
- date - 按 3 AND 条件 + countif 查询/过滤
- amazon-web-services - TLS 的 AWS DocumentDB 连接问题
- c - 在两个集群节点上运行 MPI 程序时的问题
- jquery - Jquery,在所有具有相同类的锚点之后选择第一个下一个元素
- r - 为 R 中的读取计数矩阵生成行名称的问题
- c++ - `cout` 的源代码在哪里定义?