Upgrade to Pro — share decks privately, control downloads, hide ads and more …

«Организация бизнес-логики со сложной схемой данных», Тимофей Кукушкин, ТриЛан Вологда

WebDev
December 06, 2014

«Организация бизнес-логики со сложной схемой данных», Тимофей Кукушкин, ТриЛан Вологда

Расскажу о том, какой путь мы прошли, реализуя бизнес-логику сложного enterprise решения.

WebDev

December 06, 2014
Tweet

More Decks by WebDev

Other Decks in Programming

Transcript

  1. Особенности схемы данных заказчика: • Часть данных внешняя, часть “локальная”

    • Многоязычность • Простые типы данных • Нет ссылочной целостности
  2. • Для каждой модели свое приложение. • Вся обработка и

    получение данных в приложениях. • Views отвечают только за взаимодействие пользователя и приложения “Приложения”
  3. class ArticleApp(BaseApp): model = Article multilingual_model = MultilingualArticle common_fields =

    ['author_id'] multilingual_fields = ['title', 'content'] external_fields = ['author', 'title'] search_fields = ['title'] aliases = {'author_id': 'author'} article_app = ArticleApp()
  4. • Прослойка между системой версионирования и моделью Django ORM •

    Для каждой модели свой класс интерфейса. • Работает строго с одним объектом “Интерфейсы”
  5. class ArticleInterface(interfaces.Interface): model = Article multilingual_model = MultilingualArticle common_fields =

    ['author_id'] multilingual_fields = ['title', 'content'] external_fields = ['author', 'title'] interfaces.register(ArticleInterface)
  6. class ArticleInterface(interfaces.Interface): model = interfaces.Model( 'Article', common_fields=[ fields.IntegerField('id', label='ID', primary_key=True,

    source='Site') fields.ForeignKey('author_id', label=u'автор', source='Site', required=True, to=AuthorInterface, property_name='author') ], multilingual_fields=[ fields.TextField('title', label=u'Заголовок', required=True, source='Site', searchable=True) fields.TextField('content', label=u'Содержимое', required=False, source='Local') ], label=u'Статья' ) interfaces.register(ArticleInterface) _Article = ArticleInterface.model _MultilingualArticle = ArticleInterface.multilingual_model
  7. class ArticleInterface(interfaces.Interface): name = 'Article' common_fields = [ fields.IntegerField('id', label='ID',

    primary_key=True, source='Site') fields.ForeignKey('author_id', label=u'автор', source='Site', required=True, to=AuthorInterface, property_name='author') ] multilingual_fields = [ fields.TextField('title', label=u'Заголовок', required=True, source='Site', searchable=True) fields.TextField('content', label=u'Содержимое', required=False, source='Local') ] label = u'Статья' interfaces.register(ArticleInterface) _Article = ArticleInterface.model _MultilingualArticle = ArticleInterface.multilingual_model
  8. >>> from articles.models import ArticleInterface >>> objects = ArticleInterface.objects.filter( ...

    include_removed=True)[:3] >>> objects [<articles.models.ArticleInterface u'Starbucks'>, <articles.models.ArticleInterface u'Lorem ipsum'>, <articles.models.ArticleInterface u'Dolor sit amet'>] >>> objects.count() 3 >>> for instance in objects: ... print instance.data.id 197 196 195
  9. >>> object = objects[0] >>> object.data.locales['ru'].Title 'Starbucks' >>> version =

    object.change( ... user, ... common_data={'author_id': 10}, ... locales_data={'ru': {'title': 'Bartsucks', 'content': 'Lorem ipsum'}} ... ) >>> new_object, version = ArticleInterface.objects.create( ... user, ... common_data={'author_id': 1}, ... locales_data={'ru': {'title': 'foo', 'content': 'bar'}} ... ) >>> type(new_object) articles.models.ArticleInterface
  10. В итоге • Описание схемы данных через интерфейсы полностью отражает

    схему данных заказчика • Четкое публичное API • Атомарность операций