django中實(shí)現(xiàn)邏輯刪除,主要分三步:
1.增加字段:
is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除', help_text='邏輯刪除')
2.重寫models中delete方法:
def delete(self, using=None, keep_parents=False):
"""重寫數(shù)據(jù)庫刪除方法實(shí)現(xiàn)邏輯刪除"""
self.is_delete = True
self.save()
3.views中過濾查詢結(jié)果集:
queryset = Role.objects.filter(is_delete=0).all()
class Role(models.Model):
"""角色表"""
name = models.CharField(max_length=30, unique=True, verbose_name='角色名稱',
help_text='角色名稱') # 媒體運(yùn)營,媒介,廣告運(yùn)營,銷售,活動(dòng)運(yùn)營,財(cái)務(wù),技術(shù),唯一,必填
desc = models.CharField(max_length=100, null=True, blank=True, verbose_name='角色描述', help_text='角色描述') # 非必填
is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除', help_text='邏輯刪除')
class Meta:
db_table = 'tb_role'
verbose_name = '角色'
verbose_name_plural = verbose_name
def delete(self, using=None, keep_parents=False):
"""重寫數(shù)據(jù)庫刪除方法實(shí)現(xiàn)邏輯刪除"""
self.is_delete = True
self.save()
def __str__(self):
"""控制對象輸出內(nèi)容"""
return self.name
如果使用到drf,則返回查詢結(jié)果集時(shí)進(jìn)行過濾再返回,這樣被標(biāo)記為邏輯刪除記錄就不會返回:
class RoleViewSet(ModelViewSet):
"""
list:
查詢所有角色信息
create:
創(chuàng)建角色
read:
根據(jù)角色id,查詢角色信息
delete:
根據(jù)角色id,刪除角色
update:
根據(jù)角色id,更新角色信息
partial_update:
根據(jù)角色id,部分更新角色信息
"""
queryset = Role.objects.filter(is_delete=0).all()
serializer_class = RoleModelSerializer
# 局部權(quán)限控制
# permission_classes = [IsAuthenticated]
# 精確過濾,/role_manage/roles/?name=媒體運(yùn)營,無法模糊過濾
# filter_fields = ['name'] # INSTALLED_APPS需添加應(yīng)用:'django_filters',否則報(bào)錯(cuò)
# 模糊過濾,/role_manage/roles/?name=媒體,能模糊過濾
filterset_class = RoleFilter # 自定義角色過濾器
# 局部分頁,page_size=10:每頁獲取10條,page=1:獲取第1頁
# /role_manage/roles/?page=1&page_size=10
pagination_class = StandarPageNumberPagination
原文:https://blog.csdn.net/zhu6201976/article/details/83785128