我将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()
这很好.但是,当我覆盖select时,会遇到一些问题.
@classmethod
def select(cls, *selection):
print selection
return super(BaseModel, cls).select(cls, *selection).where(cls.deleted == False)
在大多数情况下,此方法有效,但在某些情况下,如果使用带有关键字“ IN”的联接结束结果查询时出现错误,则选择它会中断:“ 1241,’操作数应包含1列”
关于如何正确替代选择或解决此问题的任何建议?
解决方法:
我总是在模型上使用一个字段来指示是否删除了模型.我不建议覆盖方法,例如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)
标签:peewee,python 来源: https://codeday.me/bug/20191121/2053126.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。