powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / DRF. Бизнес логика
14 сообщений из 14, страница 1 из 1
DRF. Бизнес логика
    #39495696
bob1970
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, новичек в 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
DRF. Бизнес логика
    #39495697
bob1970
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или mixinы насобачить? Как у вас у питонистов по фешую?
...
Рейтинг: 0 / 0
DRF. Бизнес логика
    #39496382
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bob1970,

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

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

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

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

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

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


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


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