Os sinais de salvar / excluir são geralmente favoráveis em situações em que você precisa fazer alterações que não são completamente específicas ao modelo em questão, ou podem ser aplicadas a modelos que têm algo em comum ou podem ser configurados para uso em modelos.
Uma tarefa comum em save
métodos substituídos é a geração automatizada de slugs de algum campo de texto em um modelo. Este é um exemplo de algo que, se você precisar implementá-lo para vários modelos, se beneficiaria com o uso de um pre_save
sinal, onde o manipulador de sinal poderia pegar o nome do campo do slug e o nome do campo a partir do qual gerar o slug. Uma vez que você tenha algo parecido, qualquer funcionalidade aprimorada que você colocar no lugar também se aplicará a todos os modelos - por exemplo, olhando o pacote que você está prestes a adicionar para o tipo de modelo em questão, para garantir exclusividade.
Aplicativos reutilizáveis geralmente se beneficiam do uso de sinais - se a funcionalidade que eles fornecem pode ser aplicada a qualquer modelo, eles geralmente (a menos que seja inevitável) não vão querer que os usuários tenham que modificar diretamente seus modelos para se beneficiar dele.
Com django-mptt , por exemplo, eu usei o pre_save
sinal para gerenciar um conjunto de campos que descrevem uma estrutura de árvore para o modelo que está para ser criado ou atualizado e o pre_delete
sinal para remover detalhes da estrutura de árvore para o objeto que está sendo excluído e todo o seu sub-árvore de objetos antes dele e eles são excluídos. Devido ao uso de sinais, os usuários não precisam adicionar ou modificar save
ou delete
métodos em seus modelos para que esse gerenciamento seja feito para eles, eles só precisam informar ao django-mptt quais modelos desejam gerenciar.
Você perguntou:
Haveria algum benefício em usar o despachante de sinal do Django?
Eu encontrei isso na documentação do django:
De: Substituindo métodos de modelo predefinidos
fonte
save
método"?Se você usar sinais, poderá atualizar a pontuação da revisão cada vez que o modelo de pontuação relacionado for salvo. Mas se não preciso dessa funcionalidade, não vejo razão para colocar isso em sinal, isso é muito relacionado ao modelo.
fonte
É uma espécie de desnormalização. Veja esta bela solução . Definição de campo de composição no local.
fonte
Uma pequena adição da documentação do Django sobre exclusão em massa (
.delete()
método emQuerySet
objetos):https://docs.djangoproject.com/en/1.11/topics/db/queries/#deleting-objects
E atualização em massa (
.update()
método emQuerySet
objetos):https://docs.djangoproject.com/en/2.1/ref/models/querysets/#update
fonte