在Django中设置unique_together时阻止对象创建

时间:2017-05-13 14:33:57

标签: python django view

models.py

class Registrierung(models.Model):
    kategorie = models.ForeignKey(Kategorie)
    sportler = models.ForeignKey(Sportler)
    date_added = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = (('kategorie', 'sportler'),)

views.py

def registrieren_user(request, kategorie_id):
    kategorie = get_object_or_404(Kategorie, pk=kategorie_id)
    user = get_object_or_404(User, pk=request.user.id)
    reg = Registrierung(kategorie=kategorie, sportler=user.account.sportler)
    reg.is_valid():
        reg.save()

    return HttpResponseRedirect(reverse('events:events'))

嗨,我正在尝试阻止数据库中的重复。如果我在管理面板中重复输入 Registrierung ,我会收到一条错误消息,指出由于unique_together关系而无法创建对象。

如何在我的视图中获得此功能? registrieren_user的每次执行都会被保存,尽管不可能。

修改 我的解决方案,但我认为必须有一个更好的方法。我只是使用了一种我不会创建副本的方法,但它仍然没有被标准阻止。

views.py 已修改

def registrieren_user(request, kategorie_id):
    kategorie = get_object_or_404(Kategorie, pk=kategorie_id)
    sportler= get_object_or_404(Sportler, pk=request.user.account.sportler.id)
    registrierungen = kategorie.registrierung_set.all()
    try:
        # Look if entry already exists
        reg = Registrierung.objects.filter(kategorie=kategorie).filter(sportler=sportler)
    except:
        # If no entry exists, create one and save it.
        reg = Registrierung(kategorie=kategorie, sportler=sportler)
        reg.save()
        context = {
            'kategorie': kategorie,
            'registrierungen': registrierungen,
        }
        return render(request, 'events/kategorie.html', context)

    # Return error_message because entry already exists.
    context = {
        'kategorie': kategorie,
        'error_message': "Du bist schon registriert.",
        'registrierungen': registrierungen,
    }
    return render(request, 'events/kategorie.html', context)

1 个答案:

答案 0 :(得分:0)

更好的解决方案是,强制执行模型级别清理方法,像这样,

class Registrierung(models.Model):
    kategorie = models.ForeignKey(Kategorie)
    sportler = models.ForeignKey(Sportler)
    date_added = models.DateTimeField(auto_now_add=True)

    def clean(self):
        direct = Registrierung.objects.filter(kategorie = self.kategorie, sportler = self.sportler)
        reverse = Registrierung.objects.filter(kategorie = self.sportler, sportler = self.kategorie) 

        if direct.exists() or reverse.exists():
            raise ValidationError({'Exception':'Error_Message')})