Django在同一模型中只有一个用户/一个日期

时间:2019-05-24 13:49:38

标签: django model unique

我有一个表,几个用户将添加日期。 每个用户可以添加一个日期。但是您只能将该日期添加一次。 如何防止用户多次添加同一日期? 预先感谢!

models.py

class MarcacaoRefeicoes(models.Model):
    class Meta:
        ordering = ['-data']
        verbose_name = 'Marcação de Refeição'
        verbose_name_plural = 'Marcação de Refeições'

    user = models.ForeignKey(User, related_name='marcacao_refeicoes', on_delete=models.CASCADE)
    data = models.DateField(null=True, verbose_name='Data')

    def __str__(self):
        return '{}'.format(self.data)

views.py

def marcacao_refeicoes_adicionar(request, pk=None):
    user = get_object_or_404(User, id=pk)
    form = MarcacaoRefeicoesForm(request.POST or None, request.FILES or None, initial={'user': pk})
    if form.is_valid():
        instance = form.save(commit=False)
        instance.save()
        messages.success(request, 'Marcação adicionada com sucesso!')
        return HttpResponseRedirect(reverse("marcacao_refeicoes", kwargs={'pk': pk}))
    context = {
        "user": user,
        "form": form,
    }

    return render(request,
                  'gestao/area_individual/marcacao_refeicoes/adicionar.html', context)

1 个答案:

答案 0 :(得分:3)

您正在寻找unique_together-它将禁止用户和日期具有相同的组合。

class MarcacaoRefeicoes(models.Model):
    class Meta:
        unique_together = ['user', 'data']
        ordering = ['-data']
        verbose_name = 'Marcação de Refeição'
        verbose_name_plural = 'Marcação de Refeições'

    user = models.ForeignKey(User, related_name='marcacao_refeicoes', on_delete=models.CASCADE)
    data = models.DateField(null=True, verbose_name='Data')

    def __str__(self):
        return '{}'.format(self.data)

如果您使用的是django 2.2,则应改用UniqueConstraint,因为以后unique_together可能会被弃用。

class MarcacaoRefeicoes(models.Model):
    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['user', 'data'], name='unique_item')
        ]
        ordering = ['-data']
        verbose_name = 'Marcação de Refeição'
        verbose_name_plural = 'Marcação de Refeições'

    user = models.ForeignKey(User, related_name='marcacao_refeicoes', on_delete=models.CASCADE)
    data = models.DateField(null=True, verbose_name='Data')

    def __str__(self):
        return '{}'.format(self.data)