我将peewee用作项目的ORM,并希望扩展它以处理逻辑删除。
我已添加"已删除"字段到我的基本模型并扩展了删除操作如下:
@classmethod
def delete(cls, permanently=False):
if permanently:
return super(BaseModel, cls).delete()
else:
return super(BaseModel, cls).update(deleted=True, modified_at=datetime.datetime.now())
def delete_instance(self, permanently=False, recursive=False, delete_nullable=False):
if permanently:
return self.delete(permanently).where(self.pk_expr()).execute()
else:
self.deleted = True
return self.save()
这很有效。但是,当我覆盖选择时,我会遇到一些问题。
@classmethod
def select(cls, *selection):
print selection
return super(BaseModel, cls).select(cls, *selection).where(cls.deleted == False)
这在大多数情况下都适用,但在某些情况下,当结果查询最终使用关键字" IN"出现以下错误:" 1241,'操作数应包含1列"
有关如何正确覆盖选择或解决此问题的任何建议吗?
答案 0 :(得分:3)
我总是在模型上使用一个字段来指示是否删除了模型。我不建议覆盖delete,delete_instance等方法,尤其是select。而是创建一个新的API并使用它。以下是我通常的做法:
class StatusModel(Model):
status = IntegerField(
choices=(
(1, 'Public'),
(2, 'Private'),
(3, 'Deleted')),
default=1)
@classmethod
def public(cls):
return cls.select().where(cls.status == 1)