django中实现逻辑删除,主要分三步:
1.增加字段:
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除', help_text='逻辑删除')
2.重写models中delete方法:
def delete(self, using=None, keep_parents=False):
"""重写数据库删除方法实现逻辑删除"""
self.is_delete = True
self.save()
3.views中过滤查询结果集:
queryset = Role.objects.filter(is_delete=0).all()
class Role(models.Model):
"""角色表"""
name = models.CharField(max_length=30, unique=True, verbose_name='角色名称',
help_text='角色名称') # 媒体运营,媒介,广告运营,销售,活动运营,财务,技术,唯一,必填
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):
"""重写数据库删除方法实现逻辑删除"""
self.is_delete = True
self.save()
def __str__(self):
"""控制对象输出内容"""
return self.name
如果使用到drf,则返回查询结果集时进行过滤再返回,这样被标记为逻辑删除记录就不会返回:
class RoleViewSet(ModelViewSet):
"""
list:
查询所有角色信息
create:
创建角色
read:
根据角色id,查询角色信息
delete:
根据角色id,删除角色
update:
根据角色id,更新角色信息
partial_update:
根据角色id,部分更新角色信息
"""
queryset = Role.objects.filter(is_delete=0).all()
serializer_class = RoleModelSerializer
# 局部权限控制
# permission_classes = [IsAuthenticated]
# 精确过滤,/role_manage/roles/?name=媒体运营,无法模糊过滤
# filter_fields = ['name'] # INSTALLED_APPS需添加应用:'django_filters',否则报错
# 模糊过滤,/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