比如说,有一个页面有许多与之关联的块。每个块都需要自定义渲染、保存和数据。
从代码的角度来看,最简单的方法是为每个模型定义不同的类(因此,模型)。简化如下:
class Page(models.Model):
name = models.CharField(max_length=64)
class Block(models.Model):
page = models.ForeignKey(Page)
class Meta():
abstract = True
class BlockType1(Block):
other_data = models.CharField(max_length=32)
def render(self):
"""Some "stuff" here """
pass
class BlockType2(Block):
other_data2 = models.CharField(max_length=32)
def render(self):
"""Some "other stuff" here """
pass
但是之后,
- 即使使用此代码,我也无法进行诸如
page.block_set.all()
获取所有不同块的查询,而不管块类型如何。 - 上面的原因是,每个模型定义了不同的表;使用链接模型和通用外键来解决这个问题可以解决问题,但它仍然会在每页留下多个数据库表查询。
建模它的正确方法是什么?通用外键(或其他东西)是否可以以某种方式使用,以将数据最好存储在同一个数据库表中,同时实现继承范式。
更新:
我的观点是,我怎样才能让 OOP 范式继续工作。对这么多if使用相同的方法不是我想要做的。
在我看来,最好的解决方案是创建单独的标准 python 类(最好在不同的 blocks.py 中),它定义了一个通过实例化相同模型来保存数据及其“类型”的保存。然后创建一个模板标签和一个过滤器,根据模型的类型调用渲染、保存和其他方法。