Обмен любыми узлами, а не братьями и сестрами, а не смежными братьями и сестрами, без временных узлов, без клонирования, без jquery ... IE9 +
function swapNodes (n1, n2) {var p1 = n1. ParentNode; var p2 = n2.parentNode; var i1, i2; if (! p1 ||! p2 || p1.isEqualNode (n2) || p2.isEqualNode (n1)) return; for (var i = 0; i & lt; p1.children.length; i ++) {if (p1.children [i] .isEqualNode (n1)) {i1 = i; }} for (var i = 0; i & lt; p2.children.length; i ++) {if (p2.children [i] .isEqualNode (n2)) {i2 = i; }} if (p1.isEqualNode (p2) & amp; i1 & lt; i2) {i2 ++; } p1.insertBefore (n2, p1.children [i1]); p2.insertBefore (n1, p2.children [i2]); }
Гибридные атрибуты - это специальные методы, которые действуют как свойство Python, так и выражение SQL. Пока функция difficulty
может быть выражена в SQL, ее можно использовать для фильтрации и упорядочивания, как обычный столбец.
Например, если вы вычисляете трудности, поскольку количество попугаев имеет проблему, раз десять, если проблема старше 30 дней, вы должны использовать:
from datetime import datetime, timedelta
from sqlalchemy import Column, Integer, DateTime, case
from sqlalchemy.ext.hybrid import hybrid_property
class Problem(Base):
parrots = Column(Integer, nullable=False, default=1)
created = Column(DateTime, nullable=False, default=datetime.utcnow)
@hybrid_property
def difficulty(self):
# this getter is used when accessing the property of an instance
if self.created <= (datetime.utcnow() - timedelta(30)):
return self.parrots * 10
return self.parrots
@difficulty.expression
def difficulty(cls):
# this expression is used when querying the model
return case(
[(cls.created <= (datetime.utcnow() - timedelta(30)), cls.parrots * 10)],
else_=cls.parrots
)
и запросить ее с помощью:
session.query(Problem).order_by(Problem.difficulty.desc())