编程语言
首页 > 编程语言> > python-如何扩展peewee以使用逻辑删除?

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

作者:互联网

我将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