중첩 세트 대신 nested intervals을 구현했습니다. 여러분에게 도움이되기를 바랍니다.
class Employee(db.Model):
id = db.Column(db.Integer, primary_key=True)
employee_name = db.Column(db.String(120))
parent = db.Column(db.Integer, db.ForeignKey('employee.id'), index=True)
# implements nested intervals with fractions
created = db.Column(db.DateTime, index=True)
left_num = db.Column(db.Integer, nullable=False)
left_den = db.Column(db.Integer, nullable=False)
right_num = db.Column(db.Integer, nullable=False)
right_den = db.Column(db.Integer, nullable=False)
level = db.Column(db.Integer, nullable=False)
def __init__(self, employee_name, parent):
self.created = datetime.datetime.now()
self.employee_name = employee_name
self.parent = parent
# handle case of first addition
if not parent:
self.level = 1
left_node_num = 0
left_node_den = 1
right_node_num = 1
right_node_den = 1
else:
parent_employee = Employee.query.get(self.parent)
# if the parent exists, set level to 1 more
self.level = parent_employee.level + 1
# find the most recent sibling
most_recent_sibling = Employee.query\
.filter_by(parent=self.parent)\
.order_by(Employee.id.desc())\
.first()
if not most_recent_sibling:
# if no sibling, use parent boundaries
left_node_num = parent_employee.left_num
left_node_den = parent_employee.left_den
else:
left_node_num = most_recent_sibling.right_num
left_node_den = most_recent_sibling.right_den
right_node_num = parent_employee.right_num
right_node_den = parent_employee.right_den
left_boundary = fractions.Fraction(numerator=left_node_num + right_node_num,
denominator=left_node_den + right_node_den)
right_boundary = fractions.Fraction(numerator=left_boundary.numerator + right_node_num,
denominator=left_boundary.denominator + right_node_den)
self.left_num = left_boundary.numerator
self.left_den = left_boundary.denominator
self.right_num = right_boundary.numerator
self.right_den = right_boundary.denominator
Flask-SQLAlchemy는 (이 경우) SQLAlchemy의 이벤트 시스템을 사용하지 않습니다. 왜 주어진 이벤트를 사용하지 않고'db.session.add'를 오버라이드해야한다고 생각합니까? – davidism
나는 확실히 중첩 된 세트를 가진 전문가는 아니지만, 이해할 때, "추가"는 새로운 아이템이 추가 될 때 "왼쪽"과 "오른쪽"에 대한 새로운 값을 계산하기 위해 사전 작업이 필요합니다. 잠재적으로 테이블의 모든 것에 적합합니다. (마찬가지로 제거를위한) 아마 내 응용 프로그램 내에서 정기적 인 흐름에 그 사전 작업을 추가 할 수 있고, 예에서 "before_insert"를 사용하지 않는 것 같습니다. – satellite9
아마도 https://pypi.python.org/pypi/sqlalchemy_mptt – uralbash