Форум сайта python.su
Коллеги, новичек в Django Rest Framework. Да и вообще в python
Есть ViewSet
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) ...
... comment = req.get('comment') if SomeValidator.isValid(ddate,nameTypeDoc,nameContact,comment): doc = Doc.createBy(nameTypeDoc, nameContact, ddate, comment) ...
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
serializer = self.get_serializer(doc)
class DocViewSetFilter(filters.FilterSet): serializer_classes = { 'createby': DocShortSerializer, 'get_with_docitems': DocFullSerializer,
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 ....
Офлайн
vasi.che
Много как-то вы всего написали, трудно сразу все охватить. Конкретно с рест-фреймворком я работал мало, но у меня стойкое ощущение, что вы не вполне овладели инструментарием. В частности, вы игнорируете формы джанго, которые собственно и берут на себя всю работу по созданию объектов на основании запроса, поэтому вам и приходится городить велосипед. Полагаю, что вы начали изучение сразу с рест-фреймворка, пропустив саму джангу. Рест-фреймворк, это расширение джанги, а не замена.
ПС. Должен заметить, что так делать нельзя
ddate = models.DateField(default=date.today())
Офлайн
Да. Вы правы. Я совсем недавно в django. Из java. Мне нужен именно рест. Фронтенды будут разные. Я бы на java написал и не заморачивался, просто есть время. Хочется попробовать альтернативы. Тем более что python все больше нравится. В best-practice советуют использовать толстые модели 10 основных ошибок, совершаемых Django-разработчиками
Но как-то у меня не очень складывается общая схема. В примере выше мне нужно допустим создать док-т. Если имя контрагента или тип не указан, то подставить значения по умолчанию. Для Contact, если не существует, то создать. Это бизнес-логика. Мало того что тащатся зависимости от Contact и TypeDoc, так еще и логика замешивается. Хотя, насколько я понимаю, обязанность модели только работа с БД. Во ViewSet ей (БЛ) тоже как-то не место.
Офлайн
FishHookВ двух словах в чем ошибка?
ПС. Должен заметить, что так делать нельзя
ddate = models.DateField(default=date.today())
Офлайн
vasi.che
В двух словах в чем ошибка?
ddate = models.DateField(default=date.today())
Офлайн
FishHookПонял. Спасибо.
Офлайн
vasi.cheДжанго - это фреймворк для сайтов, он мало преспособлен для задач энтерпрайза, то есть очень сложная бизнес-логика бывает редко и обычно не выносится в отдельный слой. Логика сознания-изменения объектов БД обычно реализуется в формах https://docs.djangoproject.com/en/1.11/topics/forms/
Если имя контрагента или тип не указан, то подставить значения по умолчанию. Для Contact, если не существует, то создать. Это бизнес-логика.
Отредактировано FishHook (Июль 27, 2017 09:56:12)
Офлайн
FishHookА если, допустим, создаете создаете расходную накладную и надо пересчитать остатки и себестоимость, то где размещаете расчет? Или создали заказ и надо послать email?
Офлайн
Судя по документации, прямо в обработчике формы во views.py все-таки
Отредактировано vasi.che (Июль 27, 2017 10:03:41)
Офлайн
vasi.cheИмейлы отправляются асинхронно, естественно, для этого есть куча расширений, которые реализуют почтовую службу в отдельной процессе.
Или создали заказ и надо послать email?
А если, допустим, создаете создаете расходную накладную и надо пересчитать остатки и себестоимость
Офлайн