簡體   English   中英

如何擴展peewee使用邏輯刪除?

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

我正在使用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列(s)”

有關如何正確覆蓋選擇或解決此問題的任何建議?

我總是在模型上使用一個字段來指示模型是否被刪除。 我不建議覆蓋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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM