Django только один пользователь / одна дата в той же модели - PullRequest
1 голос
/ 24 мая 2019

У меня есть таблица, к которой несколько пользователей будут добавлять даты. Каждый пользователь может добавить дату. Но вы можете добавить эту дату только один раз. Как я могу запретить пользователю добавлять одну и ту же дату более одного раза? Заранее спасибо!

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 Ответ

4 голосов
/ 24 мая 2019

Вы ищете 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)
...