Каков наилучший способ сохранить значение тега в контент в Plone: ​​zope.annotation или setattr - PullRequest
4 голосов
/ 05 октября 2011

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

Я вижу два решения:

  • zope.annotation
  • setattr: добавить атрибут к постоянному объекту

Я не знаю, почему, но из Plone2.5 было приятно использовать zope.annotation, и теперь, похоже, это не самый предпочтительный способ хранения дополнительных данных. Например, plone.uuid использует setattr для хранения уникального идентификатора.

1 Ответ

6 голосов
/ 05 октября 2011

Либо один, в зависимости от того, как часто ваши данные изменяются и насколько они велики. Это все о том, как ZODB хранит эту информацию.

Хранение данных непосредственно на объекте с использованием setattr означает, что данные хранятся в постоянной записи для этого объекта. Если это большой объект, это означает, что для этой записи будет иметь место большая транзакция.

Хранение данных в аннотации zope.annotations означает, что вы получаете отдельную постоянную запись для каждой записи аннотации, поэтому любые изменения в ваших данных приведут к уменьшению транзакции. Но если вы хотите часто обращаться к этим данным, необходимо будет загрузить эту дополнительную постоянную запись поверх всех остальных постоянных записей. Это займет место в вашем кеше ZODB, ваш сервер ZEO или сервер RelStorage должен будет обслуживать его и т. Д.

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

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

...