gpt4 book ai didi

database - Django 模型通用建模

转载 作者:搜寻专家 更新时间:2023-10-30 20:07:00 25 4
gpt4 key购买 nike

比如说,有一个页面有许多与之关联的 block 。每个 block 都需要自定义渲染、保存和数据。

从代码的角度来看,为每个模型定义不同的类(因此称为模型)是最简单的。简化如下:

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() 的查询来获取所有不同的 block ,无论 block 类型如何。
  • 上面的原因是,每个模型定义了不同的表;使用链接模型和通用外键来解决这个问题可以解决问题,但它仍然会在每个页面上留下多个数据库表查询。

建模的正确方法是什么?通用外键(或其他东西)能否以某种方式使用,以最好地将数据存储在同一个数据库表中,同时实现继承范例。

更新:

我的观点是,我怎样才能让 OOP 范例正常工作。使用相同的方法处理这么多 ifs 不是我想要做的。

在我看来,最好的解决方案是创建单独的标准 python 类(最好在不同的 blocks.py 中),它定义了一个通过实例化同一模型来保存数据及其“类型”的保存。然后创建一个模板标签和一个根据模型类型调用渲染、保存和其他方法的过滤器。

最佳答案

不要在数据库中为页面建模。页面是一种演示。

首先——也是最重要的——获取正确的数据。

“每个 block 都需要自定义渲染、保存和数据。”打破这一点:你有独特的数据。从模型的角度忽略“ block ”和“渲染”。只需定义数据而不考虑表示

说真的。只需在模型中定义数据,无需考虑呈现或渲染或其他任何事情。获得正确的数据模型。

如果您混淆了模型和演示文稿,您将永远无法正常工作。而且,如果您确实让它发挥作用,您将永远无法扩展或重用它。

其次——只有在数据模型正确之后——你才能转向展示。

您的“ block ”可以简单地用 HTML 完成 <div>标签和样式表。先试试看。毕竟,该模型有效且非常简单。这只是 HTML 和 CSS,与模型分开。

您的“ block ”可能需要自定义模板标签来创建更复杂的条件 HTML。试试那一秒。

在极端情况下,您的“ block ”可能非常复杂,以至于您必须编写专门的 View 函数来将多个对象转换为 HTML。这是非常非常罕见的。除非您确定不能使用模板标签执行此操作,否则不应执行此操作。


编辑。

“查询不同的外部数据源”

“具有保存方法的单独的简单类(不是模型)写入同一个数据库表。”

你有三个完全不同的、不相关的、独立的东西。

  • 模型。持久模型。随着save()方法。这些做的非常非常少。它们具有属性和一些方法。没有“查询不同的外部数据源”。没有“以 HTML 呈现”。

  • 外部数据源。这些是获取数据的普通 Python 类。这些对象 (1) 获取外部数据和 (2) 创建模型对象。没有别的。没有“坚持”。没有“以 HTML 呈现”。

  • 演示。这些是呈现模型对象的普通 Django 模板。没有外部查询。没有坚持。

关于database - Django 模型通用建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1939750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com