Django restframework 逻辑删除

对象delete():调用的django.model.db.base 模块delete 方法

queryset的delete调用的  django.db.models.query QuerySet类的delete方法:

 模型:

class LogisticQuerySet(QuerySet):
    def delete(self):
        self.update(is_delete=True)

class BookManager(models.Manager):
    _queryset_class = LogisticQuerySet
    def get_queryset(self):
        """
        Return a new QuerySet object. Subclasses can override this method to
        customize the behavior of the Manager.
        """
        return super().get_queryset().filter(is_delete=False)



class Book(models.Model):
    book_name=models.CharField(max_length=40)
    price=models.DecimalField(max_digits=4,decimal_places=2)
    publish=models.ForeignKey(to="Publish",on_delete=models.CASCADE,related_name="publish")
    author=models.ManyToManyField(to="Author",related_name="author")
    is_delete=models.BooleanField(default=False)


    class Meta:
        db_table="tbl_book"

    objects = BookManager()
    # def __str__(self):
    #     return self.book_name
    def delete(self, using=None, keep_parents=False):
        self.is_delete=True
        self.save()

视图:

class BookView(APIView):


    def get(self,request,*args,**kwargs):

        pk= kwargs.get("id")
        if pk :
            inst = Book.objects.filter(id=kwargs.get("id")).first()
            if inst:
                ser = SerBook(instance=inst, many=False)
                return Response(data=ser.data, status=200)
            else:
                return Response(data={"msg": "not found", "data": []}, status=200)
        else:
            inst = Book.objects.all()
            ser = SerBook(instance=inst, many=True)
            return Response(data=ser.data, status=200)


    def post(self,request,*args,**kwargs):
        data=request.data
        many=False
        if isinstance(data,list):
          many=True
        ser = SerBook(data=data, many=many)
        if ser.is_valid():
            ser.save()
            return Response(data=ser.data, status=status.HTTP_200_OK)
        else:
            return Response(data=ser.errors, status=status.HTTP_404_NOT_FOUND)


    def put(self,request,*args,**kwargs):
         data=request.data
         pk=kwargs.get("id")
         if pk :
            inst=Book.objects.filter(id=pk).first()
            print(Book.objects.filter(id=pk).values().first(),"xxxx")
            if inst:
                ser = SerBook(instance=inst, many=False,data=data
                              )
                if ser.is_valid():
                    ser.save()
                return Response(data=ser.data, status=200)


    def delete(self,request,*args,**kwargs):
        pk= kwargs.get("id")
        data=request.data
        if pk:
            inst=Book.objects.filter(id=pk).first()
            if inst:
                inst.delete()
                return Response(data={"code":200,"msg":"删除ok"})
            else: return Response(data={"code":404,"msg":"删除失败,不存在!"})
        else:
            ids=data.get("ids")
            if isinstance(ids,list):
                objs=Book.objects.filter(id__in=ids)
                objs.delete()
                return Response(data={"code":200,"msg":"删除ok"})

  

批量删除:

book表:

book_author表:

测试逻辑删查:

结果:

原文地址:https://www.cnblogs.com/SunshineKimi/p/14146104.html