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)
答案 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')})