Custom delete method on queryset

2019-09-08 07:52发布

My Django model has custom logic in the delete method. Therefore since I wane to make sure that this logic is called when I call delete on my queryset, I wrote my own queryset delete.

class MyQuerySet(QuerySet):
    # Do we have to be any fancier here?
    def delete(self):
        for m in self:
            m.delete()

and my question is do I have to do anything fancier than iterating and calling delete on each instance?

1条回答
啃猪蹄的小仙女
2楼-- · 2019-09-08 08:15

You should clear the result cache so if the queryset will be reused then DB query will be evaluated again.

Also you have to set two attributes:

  • alters_data=True prevents calling this method from templates;
  • queryset_only=True hides this method from queryset used as manager.

    class MyQuerySet(QuerySet):

    def delete(self):
        for m in self:
            m.delete()
        self._result_cache = None    
    delete.alters_data = True
    delete.queryset_only = True
    
查看更多
登录 后发表回答