Python 我应该向继承db.Model的类添加方法,还是应该将这些类继承到新类中?

Python 我应该向继承db.Model的类添加方法,还是应该将这些类继承到新类中?,python,google-app-engine,google-cloud-datastore,models,Python,Google App Engine,Google Cloud Datastore,Models,在处理继承db.Model的类时,添加方法是更好的做法,还是应该创建一个单独的类 例如,如果我想在Post上存储信息,我应该使用Post扩展数据库模型,还是应该使用PostData扩展数据库模型和Post扩展甚至引用?PostData 我认为,区别在于继承db.Model的类不会创建没有所有必需属性的实例。我希望看到的行为不是在没有必需属性的情况下保存到数据存储。哪个更干净?首选哪一种?提示:使用与数据存储模型分离的业务逻辑 我认为你应该以最纯粹的形式使用你的模型 您可以使其他处理程序将其用作显

在处理继承db.Model的类时,添加方法是更好的做法,还是应该创建一个单独的类

例如,如果我想在Post上存储信息,我应该使用Post扩展数据库模型,还是应该使用PostData扩展数据库模型和Post扩展甚至引用?PostData


我认为,区别在于继承db.Model的类不会创建没有所有必需属性的实例。我希望看到的行为不是在没有必需属性的情况下保存到数据存储。哪个更干净?首选哪一种?

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

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

您可以使其他处理程序将其用作显式类型。 不继承他们真是太不像话了。想想数据连接吧。您可以在断开连接或连接状态下使用模型

在ruby中,我会在模型上使用mixin或与之相关的模式

在python中,我建议您使用Django,因此您的视图可能包含大部分业务逻辑

尝试使用mixin

mixin类是一种使用类的继承功能将较小的行为片段组合成类的方法


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

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

您可以使其他处理程序将其用作显式类型。 不继承他们真是太不像话了。想想数据连接吧。您可以在断开连接或连接状态下使用模型

在ruby中,我会在模型上使用mixin或与之相关的模式

在python中,我建议您使用Django,因此您的视图可能包含大部分业务逻辑

尝试使用mixin

mixin类是一种使用类的继承功能将较小的行为片段组合成类的方法

向db.Model子类添加方法是一种完美的做法。如果您希望由多个模型类共享公共功能,那么让您的实际模型子类本身就是db.model子类是没有意义的,就像在标准继承中一样

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

向db.model子类添加方法是一种完美的做法。如果您希望由多个模型类共享公共功能,那么让您的实际模型子类本身就是db.model子类是没有意义的,就像在标准继承中一样


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

另一种方法是使用组合,通常是继承的更好替代方法。e、 g

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进行操作时,您可以控制可能发生的突变。然后,您可以根据需要注意使缓存项无效。

另一种方法是使用组合(通常是继承的更好替代方法)。e、 g

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进行操作时,您可以控制可能发生的突变。然后,您可以注意使其无效 根据需要缓存条目