将复杂的Python对象映射到Django模型

4 投票
2 回答
1432 浏览
提问于 2025-04-15 15:20

我在我的应用程序中有一个特定的类结构,目前是用django来展示的。我根本没有使用模型层,数据库的交互都是手动写的。

不过,我在考虑是否可以充分利用django,真正使用它的数据库抽象层。我的问题是,如何将我现有的类结构与模型层最好地结合起来。

这里有一个示例类:

class UpperClass(base):
    def __init__(self, attr1, attr2):
        self.attr1 = attr1
        self.attr2 = attr2
        # attr1 and attr2 are actually instances of, say, 
        # CustomType1 and CustomType2

那么,我打算如何将这个映射到django模型呢:

class UpperClass(models.Model):
    attr1 = CustomType1Field(...)
    attr2 = CustomType2Field(...)

这其实很简单——所有的序列化和验证的东西已经写好了,所以为CustomType1和CustomType2创建自定义字段类并不难。

真正的问题是,我该把UpperClass的自定义(与数据库无关的)行为放在哪里。在我看来,模型的作用是“把东西放进和拿出数据库”,那么这些行为该放在哪里呢?我是否应该把那些与数据库无关的方法嵌入到UpperClass的模型实例中?说实话,我对此感到很困惑。希望这至少对你有一点帮助。

2 个回答

0

这个问题主要是关于MVC(模型-视图-控制器)架构的哲学思考,以及你选择如何实现它。可以说这里没有绝对正确的方法。不过,如果你希望模型对象在与不同视图互动时都能以相同的方式工作,那么把这种行为放在模型里是有道理的。反之,如果这种行为只和某个特定的视图有关,而还有很多其他视图也在和模型互动,那么把它放在视图里可能更合适。

4

这其实有点看你想要实现什么样的具体功能。在大多数情况下,你应该把每个对象的行为放到模型类里。毕竟,它就是一个普通的Python类,所以你可以给它添加任何你想要的方法。当然,你还得考虑到它的持久性,比如说,避免在模型中添加超出定义的结构之外的额外数据。

撰写回答