python - 如何避免保存重复数据? [ Django ]

标签 python django python-3.x django-templates django-views

如果“Oficio”号码已存在,我想阻止保存表单。

有没有办法在将数据保存到数据库之前进行数据检查?

如果“Oficio”号码存在,则通过告知“现有 Oficio 号码”来显示错误。

这是我插入数据的模板:

{% 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 %}

这是我的观点:

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)

这是我的模型:

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)

最佳答案

这是你应该做的:
1. 从表单中获取您要插入的号码
2.在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

您肯定需要对此进行大量更改,但基本思想保持不变。将数字放入 try block 中。如果它不存在(这在这里是有利的),它会抛出一个 ObjectDoesNotExist 异常,允许您保存该数字,并知道它是唯一的。

关于python - 如何避免保存重复数据? [ Django ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49245743/

相关文章:

python - 在额外维度上扩展 NumPy 数组

python - 使用 Django REST 和 pyjwt 登录时出现 "Expected a string value"

python - 如何在 Google Compute Engine 中通过 Python 访问 Google Cloud SQL

python - 强制运行特定方法

python - 如何使用 Python 跳过文件中的 2 行?

带有 If Else 的 Python 嵌套列表理解

python - 有效地获取数据帧中可变长度的时间片

python - 表单启动时设置表单值

空 IntegerField 上的 Django 表单验证

python - Pandas :返回值的第一个实例和最后一个实例的索引值