1
resposta

Evitar que dados duplicados sejam adicionados via Django admin

Olá,

Tenho duas tabelas, uma de produtos e outras de valores.

No models da tabela de "valores", adicionei os campos: nome da tabela(Charfield), produtos(Foreignkey de produtos), valor(Floatfield).

Cada produto só pode ter um valor e quero bloquear pelo Django admin, a possibilidade de alguém adicionar mais entradas de valores para o mesmo produto.

Alguém já fez este tipo de tratamento, quando a adição de registros é feito pelo Django Admin?

Obrigado.

1 resposta

Olá Vander, como você está?

Peço desculpas pela demora em obter um retorno.

Para evitar que dados duplicados sejam adicionados via Django admin, você pode utilizar a classe ModelAdmin e sobrescrever o método save_model. Dentro do método save_model, é possível verificar se já existe um registro na tabela de valores para o produto que está sendo adicionado. Se já existir, basta levantar uma exceção do tipo ValidationError com uma mensagem de erro apropriada ou exibir alguma mensagem na tela que indique o erro. Abaixo um exemplo ilustrativo com os códigos apresentados em aula, do modelo de receita:

from django.contrib import admin
from django.contrib import messages
from .models import Receita
from django.utils.safestring import mark_safe


class ListandoReceitas(admin.ModelAdmin):
    list_display = ('id', 'nome_receita', 'categoria','tempo_preparo', 'publicada', 'data_receita')
    list_display_links = ('id', 'nome_receita')
    search_fields = ('nome_receita', 'categoria')
    list_filter = ('categoria',)
    list_per_page = 5
    list_editable = ('publicada',)
    ordering = ('-data_receita',)

    def save_model(self, request, obj, form, change):
        if Receita.objects.filter(nome_receita=obj.nome_receita).exists():
            messages.set_level(request, messages.ERROR)
            message = 'Já existe um valor cadastrado para este produto.'
            messages.error(request, mark_safe(f'<li class="error">{message}</li>'))
        else:
            obj.save()
            messages.success(request, f'O receita "{obj.nome_receita}" foi adicionado com sucesso.')

admin.site.register(Receita, ListandoReceitas)

Abaixo, um gif com resultado, que contém dados ilustrativos para fins didáticos:

Gif que contém já na lista do admin, a receita com o nome sopa e quando vai adicionar outra receita com o mesmo nome, aparece o erro que já existe receita com esse nome

Espero ter ajudado. Continue mergulhando em conhecimento e não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!