How do I avoid saving duplicate data? [Django]

Danilo Rodrigues

I would like to prevent the form from being saved if the "Oficio" number already existed.

Is there any way to do a data check before saving the data in the database?

If "Oficio" number exists, show error by informing "Existing Oficio Number".

This is my template that insert data:

{% extends 'base.html' %}
{% block body %}
<form action="" method="post">
    {% csrf_token %}
    {{ form.non_field_errors }}
<div class="fieldWrapper form-group">
    {{ form.numero.errors }}
    <label for="{{ form.numero.id_for_label }}">Número do Ofício:</label>
    {{ form.numero }}
</div>
<div class="fieldWrapper form-group">
    {{ form.data.errors }}
    <label for="{{ form.data.id_for_label }}">Data:</label>
    {{ form.data }}
</div>
<div class="fieldWrapper form-group">
    {{ form.para.errors }}
    <label for="{{ form.para.id_for_label }}">Para:</label>
    {{ form.para }}
</div>
<div class="fieldWrapper form-group">
    {{ form.cargo_para.errors }}
    <label for="{{ form.cargo_para.id_for_label }}">Cargo Para:</label>
    {{ form.cargo_para }}
</div>
<div class="fieldWrapper form-group">
    {{ form.assunto.errors }}
    <label for="{{ form.assunto.id_for_label }}">Assunto:</label>
    {{ form.assunto }}
</div>
<div class="fieldWrapper form-group">
    {{ form.texto.errors }}
    <label for="{{ form.texto.id_for_label }}">Texto:</label>
    {{ form.texto }}
</div>

    <button class="btn btn-group btn-primary" type="submit">Salvar</button>
<a href="/oficio/">Voltar para a listagem</a>

</form>
{% endblock %}

This is my view:

def novo(request):
    if request.method == "POST":
        form = FormOficio(request.POST, request.FILES)
        if form.is_valid():
            item = form.save(commit=False)
            item.responsavel = get_object_or_404(Responsavel, usuario=request.user)
            item.save()
            return render(request, 'salvo.html', {})
    else:
        form = FormOficio()
    context = RequestContext(request)
    return render(request, 'novo.html', {'form': form}, context)

This is my model:

class Orgao(models.Model):
    nome = models.CharField(max_length=80)
    logo = models.ImageField()
    cnpj = models.IntegerField()
    cidade = models.CharField(max_length=80)

    def __str__(self):
        return self.nome


class Setor(models.Model):
    nome = models.CharField(max_length=80)
    endereco = models.TextField()
    telefone = models.IntegerField()
    orgao = models.ForeignKey(Orgao, on_delete=models.PROTECT)

    def __str__(self):
        return self.nome


class Cargo(models.Model):
    nome = models.CharField(max_length=80)

    def __str__(self):
        return self.nome


class Responsavel(models.Model):
    usuario = models.ForeignKey(User, on_delete=models.PROTECT, default=None)
    ramal = models.IntegerField()
    setor = models.ForeignKey(Setor, on_delete=models.PROTECT)
    cargo = models.ForeignKey(Cargo, on_delete=models.PROTECT)

    def __str__(self):
        return self.usuario.get_full_name()


class Oficio(models.Model):
    data = models.DateTimeField(default=timezone.now)
    responsavel = models.ForeignKey(Responsavel, on_delete=models.PROTECT)
    para = models.CharField(max_length=80)
    cargo_para = models.CharField(max_length=80)
    assunto = models.CharField(max_length=80)
    texto = models.TextField()
    numero = models.IntegerField()

    def __str__(self):
        return "{} - {}".format(str(self.numero), self.responsavel)
Ramtin

This is what you should do:
1. Get the number that you want to insert from the form
2. In views.py:

from django.core.exceptions import ObjectDoesNotExist

number = request.POST.get('numero')
try:
    n = Oficio.objects.get(numero=number)
    # number already exists
    return False
except ObjectDoesNotExist:
    # number does not exist
    oficio = Oficio(numero=number)
    oficio.save()
    return True

You surely need to change this a lot, but the basic idea remains the same. put the number in the try block. If it does not exist (which is favorable here), it throws a ObjectDoesNotExist exception which allows you to save the number knowing it is unique.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

Using Spring Data,Mongodb, how can I avoid Duplicate vertices error

How can I avoid duplicate values when loading data using a spring batch job?

SQL Server : how to avoid duplicate data?

How do I avoid a slow loop with large data set?

How to secure table for avoid duplicate data

How do I update a table using a staging table to avoid inserting duplicate records?

How I can avoid duplicate records for insert

How do I reduce duplicate sql queries in django admin

How can I avoid duplicate switch statements

How and where do i declare a global Variable for saving Data

How do I best avoid inserting duplicate records in CakePHP?

How can I avoid duplicate templates in Meteor?

Reddit-style voting system, how do I avoid duplicate votes?

How do I avoid duplicate object entry in Mongodb?

How can I avoid duplicate items in a checkListBox

How do I quickly edit duplicate data in a single cell in Excel?

Within Django, how do I add a new value to request.POST data before saving?

how to avoid duplicate slugs when saving a friendly url

How can I avoid having duplicate data in my database?

How do I avoid data formatting when replacing text VBA?

How do i check for duplicate data in Sqlite Python?

How do I add all the duplicate values of a data frame in R?

How should I avoid duplicate data and API calls in a flat vuex structure?

How can I avoid duplicate SQL queries with Django model forms?

How do I avoid Outlook attachments being checked out when saving to SharePoint?

How to avoid duplicate data in roomdatabase?

How to Avoid Duplicate Data RestfulApi Laravel

How do I structure/design a multipage dash application to avoid duplicate callback errors?

How do I avoid printing duplicate numbers? [C language]