使用继承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
操作时,那么你就可以控制哪些突变是可能的。然后,您可以根据需要注意使缓存项无效。