2017-02-20 21 views
0

Первоначально я имел в моем models.pyValidation Исключить себя от 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() 

Это работало в том смысле, что он не позволит пользователям вводить уже существующий Project_name. Однако теперь я включил функцию редактирования/обновления. Поэтому, если пользователь хочет обновить свой собственный Team, он поднимет ValidationError, поскольку он существует в базе данных. Например, если пользователь хочет сохранить тот же Project_name, но обновить Project_number, ошибка будет повышаться. Поэтому я хочу исключить self из набора запросов. Я смотрел на этот пример:

django exclude self from queryset for validation

Так что я просто добавил следующий код в моем class Team.

def clean_name(self): 
    project_name = self.cleaned_data['Project_name'].title() 
    qs = Team.objects.filter(Project_name=project_name) 
    if self.instance.pk is not None: 
     qs = qs.exclude(pk=self.instance.pk) 
    if qs.exists(): 
     raise ValidationError("This already exists") 

Но это не работает, так как при проверке ошибки не возникают ... Любые идеи?

ответ

1

Можете ли вы убедиться, что clean_name даже получил вызов? У меня создалось впечатление, что модели имеют только метод clean, а не метод для каждого отдельного поля (этот синтаксис используется для форм). Попробуйте использовать только def clean(self):

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

+0

Я попробовал, теперь говорит, что-то: объект 'команды' не имеет атрибута 'cleaned_data' На этой линии:. Project_name = self.cleaned_data [ 'PROJECT_NAME'] название() – anderish

+0

чтения docs, 'cleaned_data' недействительны при проверке модели. Вы получите доступ к нему как 'self.project_name'. – themanatuf

 Смежные вопросы

  • Нет связанных вопросов^_^