2015-03-18 2 views
0

Моя модель Django имеет пользовательскую логику в методе delete. Поэтому, поскольку я ослабеваю, чтобы убедиться, что эта логика is called when I call delete on my queryset, я написал свой собственный queryset delete.Пользовательский метод удаления в запросе

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

и мой вопрос я должен сделать что-нибудь любитель чем итерация и называя delete на каждом конкретном случае?

+0

Обратите внимание, что это действительно неэффективно; точка метода удаления запроса заключается в том, что он делает один запрос на удаление с db, тогда как это сделает один запрос на запись. –

+0

Я понимаю, но в этом случае дополнительная логика удаления в любом случае является дорогостоящей. Также есть места в contrib, которые используют запрос, поэтому не поймать вызов удаления вызывает проблемы для меня. –

ответ

1

Вы должны очистить кэш результатов, поэтому, если запрос будет повторно использован, тогда запрос БД будет оцениваться снова.

Также вы должны установить два атрибута:

  • alters_data=True предотвращает вызов этого метода из шаблонов;
  • queryset_only=True скрывает этот метод от запроса, используемого в качестве менеджера.

    класс MyQuerySet (QuerySet):

    def delete(self): 
        for m in self: 
         m.delete() 
        self._result_cache = None  
    delete.alters_data = True 
    delete.queryset_only = True 
    
Смежные вопросы