Pull to refresh
223
0
Александр Соловьёв @ingspree

Уверенный пользователь ПК

Send message
*facepalm* постановка задачи обратная.
Не всегда всë просто и симпатично. Снаружи она очень клëвая, а внутри — очень сложная. Ну, это ожидаемо для фреймворков/библиотек такого уровня, но иногда прозреваю всë равно. :)
Да, внутренности алхимии иногда расстраивают. :(
> с чего вдруг ленивыми == не вытащит? вытиащи но у вас будет пеформанс хит при обращении.

Не вытащит — в плане они не будут у меня, это будет еще один запрос (ну, не один, десяток).

> все равно это проще чем та кверя, что привели вы. обратный джойн работает, да

Да не, не проще. Особенно учитывая, что у меня в ipython'e автодополнение для алхимии работает, а для джанги, очевидно — нет (кто ж дополнит order__event__idslines?). Энивей, я просто навскидку что-то вытащил из кода, и не подбирал специально что-то феерическое.
Ленивыми == не вытащит. select_related работает только для прямых запросов. И разве ему можно уже указать «этого тащи, этого не тащи»?

Бтв, IdsBatch — он через Order, Event, IdsLine, IdsBatch. Так что это будет что-то типа Q(order__event__idslines__idsbatches__status = RECEIVED). Я уже умудрился забыть, обратный джойн в джанге работает?
«SettlementLine.query(Settlement, Payment, Order, Event)» вытаскивает 5 объектов в каждой строке. Типа, «for settleline, settle, payment, order, event in thisquery» было бы.
Take it, take it!

return (order_models.Order.query(order_models.OrderLine, product_models.Product, v1, event_models.Event, rm.TicketwareUser)
        .join(order_models.OrderLine)
        .join((event_models.Event, event_models.Event.id == order_models.OrderLine.event_id))
        .join((product_models.Product, product_models.Product.id == order_models.OrderLine.product_id))
        .join((_Value, _Value.instance_id == order_models.Order.id))
        .join((_Field, _Field.id == _Value.field_id))
        .join((v1, v1.instance_id == order_models.Order.id)).join((f1, f1.id == v1.field_id))
        .join((v2, v2.instance_id == order_models.Order.id)).join((f2, f2.id == v2.field_id))
        .join((rm.TicketwareUser, rm.TicketwareUser.id == v2.value))
        .filter((_Value.value == prog_id) &
                (_Field.name == 'prog_id') &
                (f1.name == 'pay_method') &
                (f2.name == 'user_id') &
                (order_models.Order.created > last_z))
        .order_by(order_models.Order.created)
        .all())
Я привëл пару примеров, когда джанговский орм не годится, можешь поискать по комментариям и посмотреть.
Это клëво, но идея в том, что такое выразить джангой как-то тяжело:

items = (GuestListEntry.query(GuestListEntryDispatch, EticketDownloadHistory)
         .outerjoin(GuestListEntryDispatch)
         .join((Order, (Order.client_id == GuestListEntry.id) &
                (Order.is_guest == True)))
         .outerjoin(EticketDownloadHistory)
         .filter(GuestListEntry.batch_id == batch.id)
         .all())
Werkzeug, WTForms, Jinja2?
Django-проект тормозит из-за Django ORM. Значит надо использовать что-то другое. Вроде всë верно и как раз про эту статью, не?
Вот, что попалось на глаза из текущего проекта:

return (SettlementLine.query(Settlement, Payment, Order, Event)
        .join(Payment)
        .join((Settlement, SettlementLine.psp_settlement_line_id == Settlement.id))
        .join(Order)
        .join(Event)
        .outerjoin(IdsLine)
        .outerjoin(IdsBatch)
        .filter((SettlementLine.batch == None) &
                (SettlementLine.settle_after < datetime.now()) &
                (SettlementLine.source == SettlementLine.Source.ECOMMERCE) &
                ((Order.domain_id == Route.domain_id) |
                 (IdsBatch.status == IdsBatch.State.RECEIVED)))
        .all())

Вот реализация на питоне. Я думаю, что на джаваскрипте можно сделать нечто подобное тоже.

def humankey(fn):
  '''Turn a string into a list of substrings and numbers.

  This can be used as a key function for ``sorted``::

    >>> s = lambda *x: list(sorted(x, key=humankey))
    >>> print s('up-1', 'up-5', 'up-15', 'up-50')
    ['up-1', 'up-5', 'up-15', 'up-50']
    >>> print s('up-1.sql', 'up.sql', 'up1.sql')
    ['up.sql', 'up1.sql', 'up-1.sql']
    >>> print s('up.rb', 'up.py') # check extension sorting
    ['up.py', 'up.rb']
  '''
  fn, ext = os.path.splitext(fn)
  return [int(s) if s.isdigit() else s for s in NUM_RE.split(fn)], ext


def humansort(l):
    return list(sorted(l, key=humankey))
У меня в практике: сейчас меркуриал, перед этим проект с гитом, перед этим проект с сабвершеном и hgsubversion, перед этим еще два с меркуриалом. Да, три из них я убедил юзать меркуриал (один с нуля, один с свн, один — самый последний — с базара), но усилия того стоили. :)
Комментированый код существовать не должен. Для этого существуют системы контроля версий.
да, украинские кредитки с российским биллинг-адресом работают без проблем
Мого діда дядя нагрузку держит лучше, а томкат — только в ваших мечтах.
Да, я уже подумываю, что можно расширить Backbone.View, и сделать this.observe('inner-el', field/expression) (inner-el — внутри this.el), и будет тотальная красота. :)
Кстати, на тему нокаутных биндов к джаваскрипту, есть вот такая штука для бекбона — github.com/bruth/synapse

Information

Rating
Does not participate
Location
Киев, Киевская обл., Украина
Date of birth
Registered
Activity