在Djang中设置unique\ u together时防止对象创建

2024-09-27 21:27:14 发布

您现在位置:Python中文网/ 问答频道 /正文

型号.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'),)

视图.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,则会收到一条错误消息,说明由于唯一的\u together关系,无法创建对象。你知道吗

如何在我的视图中获得此功能?registrieren\u user的每次执行都会被保存,尽管这不可能。你知道吗

编辑: 我的解决办法,但我认为一定有更好的办法。我只是用了一种方法,我不创建一个重复,但它仍然是不防止的标准。你知道吗

视图.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)

Tags: oridgetobjectmodelsrequestcontextreg
1条回答
网友
1楼 · 发布于 2024-09-27 21:27:14

更好的解决方案是,执行一个模型级清理方法,如下所示

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

相关问题 更多 >

    热门问题