0

我编写了一个包含多个类的 Python 应用程序。假设其中一个是这样的(过于简单了 - 但我试图表示功能的类型):

class PythonXyz(object):

    def __init__(self):
        self.x = []
        self.y = []
        self.z = []

    def append(self, x, y):
        self.x.append(x)
        self.y.append(y)

    def get_x(self):
        return self.x

    def get_y(self):
        return self.y

    def get_z(self):
        return self.x + self.y

    def size(self):
        return len(self.x)

    def dump(self):
        #generate some output

    def do_some_complex_stuff(self, q):
        #lots of calculations and manipulation of the self.x and self.y lists.

    def save(self, filename):
        #some code that saves data to disk

    def load(self, filename):
        #some code that loads data from disk

当应用程序工作,但缺乏可用性时,我决定对应用程序进行 djangofy,这样我就可以将浏览器用作穷人的 GUI 并使用数据库的优点。所以我像这样制作了一个model.py:

class DjangoXyzModel(models.model):
    x = models.FloatField()
    y = models.FloatField()

我修改了 PythonXYZ 类中的 load() 和 save() 方法以使用数据库而不是文件,并使一些视图可以通过浏览器工作。

现在我得到了 3 个 Django 应用程序,[编辑]具有不同的数据库模式 [/编辑],每个都有自己的 models.py 文件和几个模型类,此外,我的原始代码在一个单独的文件夹中。我觉得这一切都变得非常混乱,我觉得将所有 PythonXyz 方法完全集成到 DjangoXyzModel 类中会更加简洁,例如:

class DjangoXyzModel(models.model):
    x_db = models.FloatField()
    y_db = models.FloatField()

    def init_lists(self):
        self.x = []
        self.y = []
        self.z = []

    def append(self, x, y):
        self.x.append(x)
        self.y.append(y)

    def get_x(self):
        return self.x

    def get_y(self):
        return self.y

    def get_z(self):
        return self.x + self.y

    def size(self):
        return len(self.x)

    def dump(self):
        #generate some output

    def do_some_complex_stuff(self, q):
        #lots of calculations and manipulation of the self.x and self.y lists.

    def save_to_db(self):
        #some code that saves x,y lists to the database

    def load_from_db(self, filename):
        #some code that loads x,y lists from the database

我的问题是:这种方法是否会被视为 Django 模型类的“污染”,或者这是否可以,只是个人喜好问题,或者这可能正是模型类应该使用的方式?如果不推荐或不赞成这样做,那么处理重复课程的更好方法是什么?

请注意,显而易见的(?)解决方案完全摆脱列表并直接从数据库中工作是不可接受的,因为我需要内存中的列表以便更快地访问。例如,列表从数据库加载到内存中一次并被访问数百或数千次。每个列表可能超过 1000 个项目,因此在需要值时批量读/写也比单独访问快得多(通常不是顺序的)。此外,在最终提交到数据库之前,通常会多次修改数据。

4

2 回答 2

1

听起来您不应该将 PythonXYZ 类与 Django 模型集成。让 Django 管理数据库(个人xyFloatField 记录)。您的代码处理真正管理模型实例集合的列表逻辑。在模型上使用旨在对单个模型实例范围之外的事物进行操作的方法是没有意义的。您可能需要一个由两部分组成的解决方案——带有Collection类的Manager 。

为您的列表级加载/保存逻辑编写一个自定义管理器。这比纯粹的泛型类要好,因为它在概念上将列表操作与它们正在操作的数据库记录联系起来。管理器将处理模型实例的初始加载到这些 x/y/z 列表中,并将列表保存回数据库。从文档中:

添加额外的 Manager 方法是向模型添加“表级”功能的首选方式。(对于“行级”功能——即作用于模型对象的单个实例的函数——使用模型方法,而不是自定义管理器方法。)

自定义 Manager 方法可以返回您想要的任何内容。它不必返回 QuerySet。

由于列表本身听起来像是实体,因此您可能需要一个 Collection 类,该类为列表提供 do_some_complex_stuff()、size()、dump() 等方法。这就是PythonXyz你现在拥有的对象。您可以进行子类化list以避免重新实现 append() 等。Manager load() 可以返回这个 Collection 类,而它的 save() 将 Collection 转换为 Model 实例以进行数据库写入。

至于在您的三个应用程序之间共享通用代码。

  • 您可以使用抽象模型来保存具有具体应用模型的公共代码。
  • 如果您需要在模式级别访问共性,请不要使用抽象父模型。(然后您将拥有一个基表和仅包含应用程序特定列的单个表。)
  • 代理模型仅适用于您想要不同的行为并且架构相同/共享的情况。
于 2012-07-14T21:00:58.160 回答
0

将所有 PythonXyz 方法完全集成到 DjangoXyzModel 类中

不。将基类分开,然后创建使用 MI 组合它们的模型代理,在适当的情况下覆盖行为。

于 2012-07-14T15:27:20.697 回答