2009-10-24 118 views
2

我在我的应用程序中有一定的类结构,目前利用django进行演示。我根本没有使用模型层, - 数据库交互例程是手写的。将复杂的python对象映射到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的Model实例中?真的,我在这里不知所措。希望这至少对你有部分意义。

回答

2

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

+0

突然间,这对我来说非常有意义。由于模型字段(models.Field的子类)映射回Python类型/类(通过to_python()),所以UpperClass的类实例如何初始化并不重要 - 无论是通过从我的代码直接调用__init__ a = UpperClass(attr1 = foo,attr2 = bar))或通过ORM(a = Upperclass.objects.get(...))。不管怎样,实例名称空间都会被attr1和attr2填充为正确的类型。我对你有正确的理解吗? – shylent 2009-10-24 19:36:43

+0

是的:UpperClass的实例是常规的Python对象,常规属性attr1和attr2(从数据库读出)。 – 2009-10-24 19:45:33

+0

非常感谢您的帮助。 – shylent 2009-10-24 19:48:01

0

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

相关问题