首页 > 解决方案 > 如何在 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_areain的计算会更好Base。我是 Python 和 Django 的新手,所以不太清楚如何实现它。有人可以提出解决方案或指出一个很好的例子吗?

标签: djangoabstract-class

解决方案


我的建议是使用子类上的函数来委派这种操作:

我有以下示例:

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


推荐阅读