说,有一个网页有很多块与它关联。每个块都需要自定义渲染,保存和数据。Django模型通用建模
最简单的是,从代码的角度来说,为每个模型定义不同的类(因此,模型)。简化如下:
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范式工作。使用与相同的方法很多 ifs不是我想要做的。
在我看来,最好的解决方案是创建单独的标准python类(最好在不同的blocks.py中),该类定义了一个保存,通过实例化相同的模型来保存数据及其“类型”。然后创建一个模板标签和一个过滤器,根据模型的类型调用渲染,保存和其他方法。
指向正确的数据模型,谢谢。 在我的情况下,对于不同的块类型,我需要查询不同的外部数据源并呈现完全不同的html。此外,缓存数据(在块级)因此,块标签并没有真正的帮助。我想的只是单独的简单类(不是模型),它们有一个保存方法,写入同一个数据库表。 – 2009-12-21 15:48:22