1. 데이터 관리방식 변경
- 기존의 테이블 모델은 DB의 쿼리 결과로 얻은 객체를 리스트형태로 가져와 2차원 리스트 형태로 관리
- 인덱싱은 편하지만 모델을 사용하는 의미가 희박해지고 수정사항을 DB에 반영하는 것도 비효율적
- 모델에 getter, setter 추가
# 화주별 일일정산 데이터 모델 class DayCalOwnerValues(Base): __tablename__ = 'daycal_owner_values' date = Column(Date, primary_key=True) owner_id = Column(Integer, primary_key=True) owner_name = Column(String, nullable=False) kd_total = Column(Integer, nullable=False) kd_fare = Column(Integer, nullable=False) kd_drop = Column(Integer, nullable=False) kd_fee4 = Column(Integer, nullable=False) after_deduction = Column(Integer, nullable=False) match_fee5 = Column(Integer, nullable=False) owner_fare = Column(Integer, nullable=False) owner_drop = Column(Integer, nullable=False) listing_fee4 = Column(Integer, nullable=False) kd_pre = Column(Integer, nullable=False) deduction_total = Column(Integer, nullable=False) total_include_pre = Column(Integer, nullable=False) def __init__(self, date, owner_id, owner_name): self.date = date self.owner_id = owner_id self.owner_name = owner_name self.kd_total = 0 self.kd_fare = 0 self.kd_drop = 0 self.kd_fee4 = 0 self.after_deduction = 0 self.match_fee5 = 0 self.owner_fare = 0 self.owner_drop = 0 self.listing_fee4 = 0 self.kd_pre = 0 self.deduction_total = 0 self.total_include_pre = 0 def get(self, idx): if idx == 0: return self.kd_total elif idx == 1: return self.kd_fare elif idx == 2: return self.kd_drop elif idx == 3: return self.kd_fee4 elif idx == 4: return self.after_deduction elif idx == 5: return self.match_fee5 elif idx == 6: return self.owner_fare elif idx == 7: return self.owner_drop elif idx == 8: return self.listing_fee4 elif idx == 9: return self.kd_pre elif idx == 10: return self.deduction_total elif idx == 11: return self.total_include_pre def set(self, idx, val): if idx == 0: self.kd_total = val elif idx == 1: self.kd_fare = val elif idx == 2: self.kd_drop = val elif idx == 3: self.kd_fee4 = val elif idx == 4: self.after_deduction = val elif idx == 5: self.match_fee5 = val elif idx == 6: self.owner_fare = val elif idx == 7: self.owner_drop = val elif idx == 8: self.listing_fee4 = val elif idx == 9: self.kd_pre = val elif idx == 10: self.deduction_total = val elif idx == 11: self.total_include_pre = val
- 모든 모델 클래스에 get, set 메소드를 위와같이 추가.
- 테이블 모델에서의 참조를 용이하게 하기 위해서 위 처럼 인덱스를 사용한 get, set을 구현
- db액션 수정
# 화주 명단 가져오기 def get_daycal_owner_list(): return session.query(DayCalOwner).order_by(DayCalOwner.id).all() # 화주별 데이터 가져오기 def get_daycal_owner_values(today = None): if today: return session.query(DayCalOwnerValues).filter(DayCalOwnerValues.date == today).order_by(DayCalOwnerValues.owner_id).all() today = date.today() values = [] owner_list = get_daycal_owner_list() for owner in owner_list: id = owner.get(0) name = owner.get(1) value = session.query(DayCalOwnerValues).filter(and_(DayCalOwnerValues.owner_id == id, DayCalOwnerValues.date == today)).first() if not value: value = DayCalOwnerValues(today, id, name) session.add(value) session.commit() values.append(value) return values # 기타 데이터 가져오기 def get_daycal_other_values(today = date.today()): value = session.query(DayCalOtherValues).filter(DayCalOtherValues.date == today).first() if not value: value = DayCalOtherValues(today) session.add(value) session.commit() return value # 결과 데이터 가져오기 def get_daycal_result(today = date.today()): value = session.query(DayCalResult).filter(DayCalResult.date == today).first() if not value: value = DayCalResult(today) session.add(value) session.commit() return value
- DB에서 쿼리를 통해 가져온 객체를 to_list를 호출하여 컬럼값이 들어있는 리스트의 형태로 반환하는
기존의 방식에서 객체 자체를 반환하는 방식으로 변경.
- DB에서 쿼리를 통해 가져온 객체를 to_list를 호출하여 컬럼값이 들어있는 리스트의 형태로 반환하는
- 테이블 모델 수정
def data(self, index, role): if index.isValid(): if role == Qt.DisplayRole: value = self.table_data[index.column()].get(index.row()) return format(value, ',') elif role == Qt.EditRole: value = self.table_data[index.column()].get(index.row()) return value elif role == Qt.TextAlignmentRole: return int(Qt.AlignRight | Qt.AlignVCenter) def headerData(self, section: int, orientation: Qt.Orientation, role: int = ...): if role == Qt.DisplayRole: if orientation == Qt.Horizontal: return self.owner_list[section].get(1) else: return self.vertical_header[section] return None def setData(self, index: QModelIndex, value: int, role): if role == Qt.EditRole: r, c = index.row(), index.column() self.changed(r, c, self.table_data[c].get(r), value) self.table_data[c].set(r, value) return True return False
- 기존에 2차원 리스트 형태였던 데이터들이 객체의 배열로 변경되면서 참조 방식도 getter를 사용하도록 수정
- 이렇게 객체를 직접 수정하는 방식을 사용하는 것으로 모델을 사용하는 의미도 퇴색되지 않으며
저장기능의 구현도 훨씬 편해진다.
- 저장 액션 구현
def save(): session.commit()
- 테이블에서 쿼리로 가져온 객체를 직접 수정하도록 변경한 덕분에 단순히 session.commit()을 호출하는 것으로
모든 변경사항이 DB에 반영된다.
- 테이블에서 쿼리로 가져온 객체를 직접 수정하도록 변경한 덕분에 단순히 session.commit()을 호출하는 것으로
- 저장 액션 메뉴와 툴바에 추가
# 저장 액션 추가 save_data = QAction(QIcon('src/img/save_icon.png'), '저장하기', self) save_data.setShortcut('Ctrl+S') save_data.setStatusTip('화주 이름 변경') save_data.triggered.connect(actions.save) file_menu.addAction(save_data) tool_bar.addAction(save_data)
- 액션을 메뉴와 툴바에 추가하고 단축키를 Ctrl+S 로 지정, 아이콘파일을 구하여 설정해준다.
이제 데이터를 입력하고 저장기능을 사용하면 애플리케이션을 종료하고 다시 실행해도 작성한 오늘의 데이터가
표시되는 것을 볼 수 있다.
'개인 프로젝트 > Accounting Program' 카테고리의 다른 글
#20 데이터 조회 - 수정기능 구현 (0) | 2021.12.07 |
---|---|
#19 데이터 조회기능 구현 (0) | 2021.12.01 |
#17 QTableView (0) | 2021.11.22 |
#16 화주 삭제, 화주 이름 변경 (0) | 2021.11.02 |
#15 모델/구조 변경, 화주 추가 기능 수정 (0) | 2021.11.02 |