将复杂的Python对象映射到Django模型
我在我的应用程序中有一个特定的类结构,目前是用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类,所以你可以给它添加任何你想要的方法。当然,你还得考虑到它的持久性,比如说,避免在模型中添加超出定义的结构之外的额外数据。