Должен ли я добавить методы к своим классам, которые наследуют db.Model, или я должен наследовать эти классы в новый класс? - PullRequest
1 голос
/ 30 июня 2011

При работе с классами, которые наследуют db.Model, лучше добавлять методы или лучше создать отдельный класс?

Например, если я хочу хранить информацию в сообщениях, нужно лиPost extension db.Model, или я должен иметь PostData extension db.Model и Post extension (или даже ссылку?) PostData?

Разница, я думаю, в том, что классы, которые наследуют db.Model, не будутэкземпляры без всех обязательных атрибутов.Поведение, которое я хотел бы видеть, это не сохранение в хранилище данных без обязательных атрибутов.Что чище?Что предпочтительнее?

Ответы [ 3 ]

2 голосов
/ 01 июля 2011

Добавление методов к db.Model подклассам - отличная практика.Есть смысл в том, чтобы ваш реальный подкласс модели представлял собой подкласс db.Model, если у вас есть общие функциональные возможности, которые вы хотите использовать совместно несколькими классами моделей - как в стандартном наследовании.

Я не уверен, какпредложенный вами подход поможет «не сохранять данные в хранилище данных без обязательных атрибутов», если только вы не планируете создавать свои собственные модели данных, которые вы переводите в модели хранилищ данных и из них - что будет просто огромной тратой времени (ваш и процессор).Как работает библиотека хранилища данных, невозможно создать модель со значениями, которые не проверяются, и я не уверен, почему вы хотите.

2 голосов
/ 30 июня 2011

Совет: используйте бизнес-логику, отделенную от модели хранилища данных

Я думаю, вы должны использовать свои модели в их чистом виде.

Вы можете использовать другие обработчиките, как явные типы.Это чище, чтобы не наследовать их.Просто подумайте о подключении к данным.Вы можете использовать свои модели как в автономном, так и в подключенном состоянии.

В ruby ​​на моделях я бы использовал mixins или шаблонised_with

В Python я советую использовать Django, так что ваши представлениясодержат большую часть бизнес-логики.http://www.djangobook.com/en/1.0/chapter05/

Попробуйте использовать миксины!

Класс миксина - это способ использования возможностей наследования классов для создания класса из более мелких частей.поведения.

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

0 голосов
/ 13 апреля 2013

Другой способ - использовать композицию (обычно лучшую альтернативу наследованию). например,

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

Многие сочли бы это ненужным косвенным указанием, и я не виню этих людей. Тем не менее, это может быть хорошо, если вы хотите ограничить MyModel экземпляры способом, который не поддерживается параметром validator в db.Property. Э.Г.

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

Обеспечение ограничения без помощи MyWrapper будет сложнее.

Другая причина использования обертки заключается в том, что вы хотите реализовать собственную схему кэширования, хотя ndb решает эту проблему в более общем виде. Когда MyModel можно манипулировать только через MyWrapper, тогда вы можете контролировать возможные мутации. Затем вы можете по мере необходимости аннулировать записи в кэше.

...