Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / DRF. Бизнес логика / 14 сообщений из 14, страница 1 из 1
27.07.2017, 07:43
    #39495696
bob1970
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DRF. Бизнес логика
Коллеги, новичек в Django Rest Framework. Да и вообще в python
Есть ViewSet
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
class DocViewSet(viewsets.ModelViewSet):
  queryset = Doc.objects.all()
  serializer_class = DocSerializer

...
  @list_route(methods=['post'])
  def createby(self, request):
    """
   Создание документа по атрибутам
    """
    req = request.data
    ddate = req.get('ddate')
    nameTypeDoc = req.get('typedoc')
    nameContact = req.get('contact')
    comment = req.get('comment')
    doc = Doc.createBy(nameTypeDoc, nameContact, ddate, comment)
    serializer = self.get_serializer(doc)
    return Response(serializer.data)
...



Что не нравится.
1. Из request дергаются атрибуты создаваемого док-та. Ладно. Между получением атрибутов и Doc.create хотелось бы воткнуть валидатор. Валидировать прямо в методе не красиво. Ну допустим:
Код: python
1.
2.
3.
4.
5.
    ...
    comment = req.get('comment')
    if SomeValidator.isValid(ddate,nameTypeDoc,nameContact,comment):
      doc = Doc.createBy(nameTypeDoc, nameContact, ddate, comment)
    ...


В каком-то другом методе будет другой валидатор. Возникает куча зависимостей от валидаторов.

2. Из ViewSet напрямую дергаю метод модели. В параметрах nameTypeDoc,nameContact. Получается в модель Doc нужно закинуть зависимости TypeDoc и Contact
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
class Doc(models.Model):
  """
  Заголовок документа
  """
  n = models.AutoField(primary_key=True)
  typeDoc = models.ForeignKey('TypeDoc', default=1, db_column='typedoc_n')
  ddate = models.DateField(default=date.today())
  contact = models.ForeignKey('Contact', default=1, db_column='contact_n')
...
  @staticmethod
  def createBy(nameTypeDoc=None, nameContact=None, ddate=None, comment=''):
    """
      Создание документа по названию типа и имени контакта
      ddate в формате 'YYYY-mm-dd'
    """
    typeDoc = TypeDoc().getByName(nameTypeDoc)
    contact = Contact().getOrCreate(nameContact)
    if ddate is None:
      _ddate = date.today()
    else:
      d = datetime.strptime(ddate, '%Y-%m-%d')
      _ddate = date(d.year, d.month, d.day)
    doc = Doc(contact=contact, typeDoc=typeDoc, ddate=_ddate, comment=comment)
    doc.save()
    return doc



Ваще не здорово!

3.
Код: python
1.
serializer = self.get_serializer(doc)


Для этого метода пусть будет сериализатор по умолчанию. Для другого нужен другой. Можно так:
Код: python
1.
2.
3.
4.
class DocViewSetFilter(filters.FilterSet):
    serializer_classes = {
       'createby': DocShortSerializer,
       'get_with_docitems': DocFullSerializer,


Еще один пласт зависимостей.
Че-то как-то жирно.

Получается нужен какой-то слой бизнес-логики DocService , ктр. связывает Doc, Contact, TypeDoc. Зависимости от валидаторов и сериализаторов вроде все-таки остаются тут.

Вообще хотелось бы нечто следующее:
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
from models import TypeDoc, Contact, Doc

class DocCreator  :
     
  def createby(params)
    typeDoc = TypeDoc().getByName(nameTypeDoc)
    contact = Contact().getOrCreate(nameContact)
    if ddate is None:
      _ddate = date.today()
    else:
      d = datetime.strptime(ddate, '%Y-%m-%d')
      _ddate = date(d.year, d.month, d.day)
    doc = Doc(contact=contact, typeDoc=typeDoc, ddate=_ddate, comment=comment)
    doc.save()
    return doc
....



В DocViewSet закинуть import DocCreator

Так что-ли?
...
Рейтинг: 0 / 0
27.07.2017, 07:50
    #39495697
bob1970
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DRF. Бизнес логика
Или mixinы насобачить? Как у вас у питонистов по фешую?
...
Рейтинг: 0 / 0
28.07.2017, 02:00
    #39496382
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DRF. Бизнес логика
bob1970,

сразу скажу, я не пользуюсь Django REST, поэтому какой там фэншуй - не знаю,
в Django фэншуй - MVC
особо не углублялась, но код ваш выглядит странно, вопросы вызывает createBy метод, создается впечатление что вы не видите разницы между созданием сервиса и его использованием

советую почитать про работу с классами в Питоне и про создание ДБ моделей в Django
по Питону смотрите документацию, по Django документацию и djangobook
...
Рейтинг: 0 / 0
28.07.2017, 13:43
    #39496666
bob1970
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DRF. Бизнес логика
mini.weblabbob1970,

сразу скажу, я не пользуюсь Django REST, поэтому какой там фэншуй - не знаю,
в Django фэншуй - MVC
особо не углублялась, но код ваш выглядит странно, вопросы вызывает createBy метод, создается впечатление что вы не видите разницы между созданием сервиса и его использованием
Я точно чего-то не догоняю. И хочу понять что именно. Хорошо. Пускай будет не Django Rest Framework. Просто Django. Допустим, вам нужно удалить какой-то набор записей (н.п. документы за период). Нужно вызвать какой-то сервис, на входе дать период. В каком месте вы бы разместили этот процесс? В модели? Или , если говорить про просто Django, то напрашивается в самом обработчике формы. Так что-ли? Т.к. в django под контроллером понимается view.py.
...
Рейтинг: 0 / 0
29.07.2017, 20:49
    #39497055
bob1970
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DRF. Бизнес логика
В общем, результаты поиска ответов у зарубежных и отечественных коллег. Вот боле-мене развернутый ответ Large web apps in Python: A good architecture Не view , ни model не подходят для этого дела, надо выносить в отдельный слой. Похожих мнений достаточно. На Django такое не пишут. Кроме сайтов с примитивными формами и crud она не годится. Вопрос снят.
...
Рейтинг: 0 / 0
29.07.2017, 21:30
    #39497065
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DRF. Бизнес логика
bob1970,

ну вообще-то, если вы пишите api и пользуетесь Django REST и у вас задача:
"удалить какой-то набор записей (н.п. документы за период)"
очевидно же, что вам нужно дописать в ваш api метод,
т.е. нужно взять доку для Джанго Рест и посмотреть куда прикручиваются методы.
...
Рейтинг: 0 / 0
30.07.2017, 10:16
    #39497156
DRF. Бизнес логика
mini.weblab,

Ты, как обычно, поняла все слишком примитивно. Объясняю: автор не нашел, где в мире Джанги место для слоя бизнес-логики. И совершенно справедливо не нашел, потому что его там нет. Модели Джанги отображают одну таблицу базы данных на питоний класс и позволяют осуществлять CRUD операции в пределах этой таблицы. Другими словами Джанго реализует паттерн Active Record, который удобен, когда данные спроектированы таким образом, что единица интересной для пользователя информации извлекается из соответствующей таблицы БД как единичная запись. На практике в проектах выходящих за рамки простого интегратора данных объекты предметной области агрегируют данные из множества таблиц и живут дольше одного акта запрос/ответ, и какая-то более-менее осмысленная структура приложения получается, когда применяются паттерны Unit of Work, Repository, Data Mapper и пр. которые формируют слой бизнес-логики. Джанга не предоставляет никаких решений для организации бизнес-логики как отдельного слоя, и если, например, возможность выполнить несколько запросов в одной транзакции ОРМ Джанги предоставляет, то о персистентности объектов предметной области надо каким-то образом заботиться самостоятельно, надо придумывать как хранить состояние этих объектов между запросами, и в итоге изобретать самописные IoC-контейнеры и прочие энтерпрайзовые плюшки.
...
Рейтинг: 0 / 0
30.07.2017, 10:25
    #39497159
bob1970
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DRF. Бизнес логика
это опять я,
Спасибо, добрый человек! Вы все правильно поняли и объяснили. Еще раз убедили меня в назначении и применении django.
...
Рейтинг: 0 / 0
30.07.2017, 10:28
    #39497160
DRF. Бизнес логика
bob1970это опять я,
Спасибо, добрый человек! Вы все правильно поняли и объяснили. Еще раз убедили меня в назначении и применении django.
Да мы уже общались на эту тему в другом месте
...
Рейтинг: 0 / 0
30.07.2017, 10:58
    #39497171
bob1970
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DRF. Бизнес логика
Да мы уже общались на эту тему в другом месте За наводку на pyramid, отдельный респект :)
...
Рейтинг: 0 / 0
30.07.2017, 15:38
    #39497239
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DRF. Бизнес логика
а я напомню, тс хотел
"удалить какой-то набор записей (н.п. документы за период)"
и я бы не назвала это "чем-то выходящим за рамки", с джанго с этой зачей прекрасно справляется, как и любой веб-фреймворк.

я не совсем понимаю, почему вы ждете от фреймворков решения каких-то нестандартных задач.
с другой стороны я конечно же соглашусь, что джанго-фреймворк предназначен для разработки веб-сайтов, и будет не лучшим выбором для разработки систем наведения ракет большой и средней дальности
...
Рейтинг: 0 / 0
30.07.2017, 15:58
    #39497242
хряпа
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DRF. Бизнес логика
mini.weblabа я напомню
нет, не понимаешь, ввиду отсутствия мозгов
занимайся своим делом - расти детей, подметай трамвайные пути, крась ногти на ногах.
...
Рейтинг: 0 / 0
30.07.2017, 17:53
    #39497290
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DRF. Бизнес логика
да я и так занимаюсь своим делом, не надо за меня переживать.
чтобы использовать Джанго много мозгов совсем не нужно,
достаточно знать базовые понятия веб-разработки, уметь работать с классами и БД,
в частности, неплохо знать разницу между веб-страницей и веб-сервисом
...
Рейтинг: 0 / 0
30.07.2017, 18:26
    #39497309
DRF. Бизнес логика
mini.weblabда я и так занимаюсь своим делом, не надо за меня переживать.
чтобы использовать Джанго много мозгов совсем не нужно,
достаточно знать базовые понятия веб-разработки, уметь работать с классами и БД,
в частности, неплохо знать разницу между веб-страницей и веб-сервисом


Ну вот именно поэтому твоя стезя - это ногти, трамвайные пути и джанга, архитектуру более сложной системы ты понять не в состоянии, о чем предыдущие несколько постов и говорят.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / DRF. Бизнес логика / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]