我应该向继承db的类添加方法吗.模型,或者我应该将这些类继承到一个新的类中



使用继承db的类时。模型,添加方法是更好的做法,还是应该创建一个单独的类?

例如,如果我想存储关于帖子的信息,我应该拥有Post扩展数据库吗。模型,或者应该让PostData扩展数据库。模型和Post扩展(甚至引用?)PostData?

我认为,不同之处在于类继承了数据库。模型不会在没有所有必需属性的情况下创建实例。我希望看到的行为不是保存到没有所需属性的数据存储中。哪个更干净?哪个是首选?

db.Model子类添加方法是一种非常好的做法。如果你有想要由几个模型类共享的公共功能,那么让你的实际模型子类——它本身就是db.Model子类——就像在标准继承中一样——是没有意义的。

我不确定您提出的方法将如何帮助"在没有所需属性的情况下不保存到数据存储",除非您计划创建自己的数据模型,并将其转换为数据存储模型和从数据存储模型转换过来——这将是一个巨大的时间浪费(包括您和处理器的时间)。按照数据存储库的工作方式,不可能创建一个具有未验证值的模型,我也不确定您为什么要这样做。

提示:使用与数据存储模型分离的业务逻辑

我认为你应该以最纯粹的形式使用你的模型

您可以使其他处理程序将这些处理程序用作显式类型。不继承他们是一件很干净的事。想想数据连接就知道了。您可以在断开连接或连接状态下使用您的模型。

在ruby中,我会在模型上使用mixin或concerned_withpattern

在python中,我建议使用Django,因此您的视图可能包含大部分业务逻辑。http://www.djangobook.com/en/1.0/chapter05/

尝试使用mixin

mixin类是一种使用类的继承功能由较小的行为组成类的方式。

https://docs.djangoproject.com/en/dev/ref/class-based-views/

另一种方法是使用组合(通常是继承的更好选择)。例如

class MyModel(db.Model): pass
# Avoiding inheritance.
class MyWrapper(object):
  def __init__(self, my_model):
    # The leading _ indicates that methods in this class should
    # access self._my_model.
    self._my_model = my_model

许多人会认为这是不必要的间接手段,我不怪那些人。不过,如果您希望以db.Property中的validator参数不支持的方式约束MyModel实例,这可能是好的。例如

class MyModel(db.Model):
  # f(x, y, z) = 0
  x = db.FloatProperty()
  y = db.FloatProperty()
  z = db.FloatProperty()

如果没有MyWrapper的帮助,强制执行约束将更加困难。

使用包装器的另一个原因是您想要实现自己的缓存方案,尽管ndb以更通用的方式解决了这个问题。当MyModel只能通过MyWrapper操作时,那么你就可以控制哪些突变是可能的。然后,您可以根据需要注意使缓存项无效。

最新更新