2017-05-13 2 views
0

models.pyPrevent Objekterstellung, wenn unique_together in Django

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

Hallo gesetzt ist, versuche ich Duplikate in meiner Datenbank zu verhindern. Wenn ich im Admin-Panel eine doppelte Eingabe von Registrierung mache, erhalte ich eine Fehlermeldung, dass ich wegen der unique_together-Beziehung kein Objekt anlegen kann.

Wie bekomme ich diese Funktionalität aus meiner Sicht? Jede Ausführung von registrieren_user wird gespeichert, obwohl dies nicht möglich sein sollte.

EDIT: Meine Lösung, aber ich denke, es muss ein viel besserer Weg sein. Ich benutze nur einen Weg, wo ich kein Duplikat erstelle, aber es wird immer noch nicht vom Standard verhindert.

views.py bearbeitet:

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) 

Antwort

0

viele bessere Lösung ist, eine Modellebene saubere Methode, wie dies zu erzwingen,

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

Thx. Wusste nicht, wonach man in Google suchen sollte. –

+0

die Antwort aktualisiert ... versuchen Sie den Code, es ist effizienter, nehme ich an ... – zaidfazil

Verwandte Themen