将复杂python对象映射到django模型

将复杂python对象映射到django模型,python,django,Python,Django,我的应用程序中有一个特定的类结构,目前使用django进行表示。我根本没有使用模型层,-数据库交互例程是手工编写的 然而,我正在考虑是否可以充分利用django的潜力,并实际使用数据库抽象层。问题是如何最好地将现有的类结构与模型层集成 一个示例类: class UpperClass(base): def __init__(self, attr1, attr2): self.attr1 = attr1 self.attr2 = attr2 #

我的应用程序中有一个特定的类结构,目前使用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
Sow我将如何将其映射到django模型:

class UpperClass(models.Model):
    attr1 = CustomType1Field(...)
    attr2 = CustomType2Field(...)
这很简单——所有的序列化和验证内容都已经编写好了,因此为CustomType1和CustomType2创建自定义字段类一点也不困难


真正的问题是,我应该把实际上层阶级的定制(与数据库无关)行为放在哪里。在我的理解中,模型是用来“将数据输入和输出数据库”的,但是这种行为会发生在哪里呢?我是否将与数据库无关的方法嵌入到上层类的模型实例中?真的,我在这里不知所措。希望这至少对您有部分意义。

这在某种程度上取决于您想要编码的具体行为。在大多数情况下,您应该尝试将每个对象的行为放入模型类中。毕竟,它是一个常规的Python类,所以您可以给它任何您想要的方法。当然,您确实需要考虑持久性,例如,通过避免架构中指定的成员数据之外的其他成员数据。

这在很大程度上是一个关于MVC以及如何选择实现它的哲学问题。可以说,这里没有正确的方法,但是假设您希望模型对象都以某种方式运行,而不管与它们交互的视图是什么,那么将此行为附加到模型是有意义的。如果行为仅特定于某个视图,并且有许多其他视图与模型交互,那么将其附加到视图可能更有意义。

突然间,这对我来说非常有意义。由于模型字段(models.Field的子类)映射回python类型/类(通过to_python()),因此如何初始化UpperClass的类实例并不重要,可以通过我的代码直接调用init(a=UpperClass(attr1=foo,attr2=bar))或通过ORM(a=UpperClass.objects.get(…)。无论哪种方式,实例名称空间都会被初始化为正确类型的attr1和attr2填充。我理解正确了吗?是的:UpperClass的实例是常规Python对象,具有常规属性attr1和attr2(从数据库中读取)。