简体   繁体   English

如何扩展peewee使用逻辑删除?

[英]How to extend peewee to use logical deletes?

I'm using peewee as ORM for a project and want to extend it to handle logical deletes. 我正在使用peewee作为项目的ORM,并希望扩展它以处理逻辑删除。

I've added "deleted" field to my base model and have extended the delete operations as follows: 我已将“已删除”字段添加到我的基本模型,并扩展了删除操作,如下所示:

@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()

This works great. 这非常有效。 However, when I'm overriding select I get some problems. 但是,当我超越选择时,我会遇到一些问题。

@classmethod
def select(cls, *selection):
    print selection
    return super(BaseModel, cls).select(cls, *selection).where(cls.deleted == False)

This works in most cases, but in certains selects it breaks when the resulting query ends up using a join with the keyword "IN" with the following error: "1241, 'Operand should contain 1 column(s)" 这在大多数情况下都适用,但在某些情况下,当结果查询最终使用带有关键字“IN”的连接时,选择它会中断,并出现以下错误:“1241,'操作数应包含1列(s)”

Any suggestion on how to properly override select or work around this problem? 有关如何正确覆盖选择或解决此问题的任何建议?

I always use a field on my models to indicate whether the model is deleted. 我总是在模型上使用一个字段来指示模型是否被删除。 I do not recommend overriding methods like delete, delete_instance and especially select. 我不建议覆盖delete,delete_instance等方法,尤其是select。 Rather create a new API and use that. 而是创建一个新的API并使用它。 Here's how I typically do it: 以下是我通常的做法:

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM