2014-12-24 3 views
0

flask-sqlalchemy를 사용하여 중첩 세트 모델을 구현하려고합니다. http://docs.sqlalchemy.org/en/rel_0_9/_modules/examples/nested_sets/nested_sets.htmlflask-sqlalchemy에서 삽입, 제거하기 전에 작업 수행

마법이 before_insert 자신의 정의에 일어날 것 :

나는 SQLAlchemy의 사용 예를 볼

@event.listens_for(Employee, "before_insert") 
def before_insert(mapper, connection, instance): 
    if not instance.parent: 
     instance.left = 1 
... 

나는 나에게를 대체 할 수있는 방법이 있는지 찾는 데 문제가 있었어요 비슷한 방법으로 flask-sqlalchemy 프레임 워크에서 db.session.add를 제거하십시오. 아니면 여기서 다른 일을해야합니까?

+1

Flask-SQLAlchemy는 (이 경우) SQLAlchemy의 이벤트 시스템을 사용하지 않습니다. 왜 주어진 이벤트를 사용하지 않고'db.session.add'를 오버라이드해야한다고 생각합니까? – davidism

+0

나는 확실히 중첩 된 세트를 가진 전문가는 아니지만, 이해할 때, "추가"는 새로운 아이템이 추가 될 때 "왼쪽"과 "오른쪽"에 대한 새로운 값을 계산하기 위해 사전 작업이 필요합니다. 잠재적으로 테이블의 모든 것에 적합합니다. (마찬가지로 제거를위한) 아마 내 응용 프로그램 내에서 정기적 인 흐름에 그 사전 작업을 추가 할 수 있고, 예에서 "before_insert"를 사용하지 않는 것 같습니다. – satellite9

+0

아마도 https://pypi.python.org/pypi/sqlalchemy_mptt – uralbash

답변

0

중첩 세트 대신 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 
관련 문제