from peewee import * db = DatabaseProxy() class BaseModel(Model): class Meta: database = db class ListModel(BaseModel): name = CharField(default="") chat_id = IntegerField() @property def content(self) -> dict: return {e.id: e.entry for e in self.entries} @content.setter def content(self, new_content: dict): old_content = self.content if len(old_content) < len(new_content): # we assume: only 1 item added (last item) new_item = list(new_content.values())[-1] ListEntryModel.create(list_model=self, entry = new_item) elif len(old_content) > len(new_content): to_delete_ids = set(old_content.keys()) - set(new_content.keys()) ListEntryModel.delete().where(ListEntryModel.id.in_(list(to_delete_ids))).execute() @property def done_dict(self): return {e.id: e.done for e in self.entries} @done_dict.setter def done_dict(self, new_done: dict): old_done_dict = self.done_dict for k,d in new_done.items(): if d != old_done_dict[k]: ListEntryModel.update(done = d).where(ListEntryModel.id == k).execute() class ListEntryModel(BaseModel): list_model = ForeignKeyField(ListModel, backref="entries", on_delete="CASCADE") entry = TextField(default="") done = BooleanField(default=None, null=True) def set_db(db_path): db.initialize(SqliteDatabase(db_path)) with db: db.create_tables([ListModel, ListEntryModel], safe=True)