首页 > 解决方案 > Django - 如何从继承相同抽象类的许多模型中创建一个 TableView?

问题描述

我正在尝试创建一个 TableView 来显示我的项目中从同一个抽象类继承的所有对象。我知道我可能需要使原始类不抽象,但该项目已经在运行,我宁愿现在不更改模型。

抽象类是这样的:

class WarehouseBase(models.Model):
    region = models.ForeignKey(Region, on_delete=models.PROTECT, null=True, blank=False, verbose_name='Región')
    name = models.CharField(max_length=50, verbose_name='Nombre', unique=True)

    class Meta:
        abstract = True

从它继承的类是:

class SaleWarehouse(WarehouseBase):
    TYPES = (
        (0, 'Autotanque'),
        (1, 'Estación de carburación')
    )
    type = models.IntegerField(choices=TYPES, null=False, blank=False, verbose_name='Tipo')
    # price = models.ForeignKey(SpecificPrice, on_delete=models.SET_NULL, null=True, blank=True, related_name='warehouse')
    lat = models.DecimalField(max_digits=9, decimal_places=6, null=True)
    lng = models.DecimalField(max_digits=9, decimal_places=6, null=True)

    price = models.FloatField(verbose_name='Precio', validators=[MinValueValidator(0.0), MaxValueValidator(1000.0)], null=True, blank=True)
    price_date = models.DateField(verbose_name='Fecha de precio', null=True, blank=True, auto_now_add=True)

    def __str__(self):
        return '{} - {}'.format(str(self.pk), self.name)


class GeneralWarehouse(WarehouseBase):
    @property
    def total_capacity(self):
        capacity = 0.0
        for tank in self.tanks:
            capacity += tank.max_capacity
        return capacity

    def __str__(self):
        return "Almacén general '{}'".format(self.name)

刚刚添加了对包含所有仓库的视图的新要求,但是在制作项目时不需要这样做。我一直在搜索,并找到了更改数据库模型的方法,以便我可以创建 WarehouseBase 对象的查询集,但它需要在数据库中进行许多更改,这将是非常危险的,因为有几个功能依赖于这些模型。

有没有办法让 TableView 显示所有 SaleWarehouse 和 GeneralWarehouse 对象,而不更改模型?

标签: django

解决方案


您可以创建对象列表或字典并从模型、SaleWarehouse 和 GeneralWarehouse 添加对象。这样,您可以将来自两个模型的数据合并到一个列表中,而无需对数据库进行任何更改。


推荐阅读