2017-02-20 1 views
0

Ursprünglich hatte ich in meinem models.pyValidation ausschließen Selbst Von QuerySet

def validate_project_name(value,self): 
    project_name = Team.objects.filter(Project_name=value) 
    if self.pk: 
     project_name = project_name.exclude(pk=self.pk) 
    if project_name: 
     raise ValidationError('This already exists.') 


class Team(models.Model): 
    Project_name = models.CharField(max_length=250, validators=[validate_project_name]) 
    Project_number = models.IntegerField() 

Dies im Sinne gearbeitet, dass es Benutzern die Eingabe nicht zulassen, dass bereits eine bestehende Project_name. Jetzt habe ich jedoch eine Bearbeitungs-/Aktualisierungsfunktion eingebaut. Wenn also ein Benutzer seine eigene Team aktualisieren möchte, wird der ValidationError ausgelöst, da er in der Datenbank vorhanden ist. Wenn der Benutzer beispielsweise Project_name beibehalten möchte, aber die Project_number aktualisieren, wird der Fehler ausgelöst. Also ich möchte self aus dem Queryset ausschließen. Ich sah dieses Beispiel:

django exclude self from queryset for validation

Also habe ich einfach hinzugefügt, um den folgenden Code in meinem class Team.

Aber es funktioniert nicht, da in der Validierung Fehler nicht ausgelöst wird ... Irgendwelche Ideen?

Antwort

1

Können Sie sicherstellen, dass clean_name sogar aufgerufen wird? Ich hatte den Eindruck, dass Modelle nur eine clean-Methode hatten, keine Methode für jedes einzelne Feld (diese Syntax wird für Formulare verwendet). Versuchen Sie, nur def clean(self):

https://docs.djangoproject.com/en/1.10/ref/models/instances/#django.db.models.Model.clean

+0

mit ich es versucht, jetzt etwas sagt: 'Team' Objekt hat kein Attribut 'cleaned_data' Auf dieser Linie. Project_name = self.cleaned_data [ 'Project_name'] Titel() – anderish

+0

lesen Die Dokumentation "cleaned_data" ist bei der Modellvalidierung nicht gültig. Du wirst darauf zugreifen wie 'self.project_name'. – themanatuf