Обновление Django() работает не так, как ожидалось

#python-3.x #django #django-views

Вопрос:

У меня есть функция, которая изменяет детали моих моделей при запуске. Я не могу заставить его выполнять ту работу, которую я намерен ему поручить. Я не могу сказать, почему это так. Любая помощь будет с благодарностью оценена.

Код ошибки:

     @login_required(login_url='/login/')
    def move_students(request):
        try:
            Klass.objects.filter(school=request.user.school,name=1).update(name=2)
        except Exception as e:
            messages.info(request,f'erroerd at {e}')
        return redirect('/')
 

Модель:

     class Klass(models.Model):
        name = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(5),], help_text='E.g 1,2,3, 4')
        school = models.ForeignKey(School,on_delete=models.CASCADE)
        def __str__(self):
            return str(self.name)
        class Meta:
            verbose_name_plural = 'Classes'
            unique_together = ("school", "name")
 

Трассировка стека:

     Traceback (most recent call last):
      File "C:UsersFR GULIKAppDataLocalProgramsPythonPython38-32libsite-packagesdjangocorehandlersexception.py", line 47, in inner
        response = get_response(request)
      File "C:UsersFR GULIKAppDataLocalProgramsPythonPython38-32libsite-packagesdjangocorehandlersbase.py", line 181, in _get_response
        response = wrapped_callback(request, *callback_args, **callback_kwargs)
      File "C:UsersFR GULIKAppDataLocalProgramsPythonPython38-32libsite-packagesdjangocontribauthdecorators.py", line 21, in _wrapped_view
        return view_func(request, *args, **kwargs)
      File "D:PythonDjangoCompleted Projectslib_systemLibrary-Systemlibmanviews.py", line 29, in move_students
        Klass.objects.filter(school=request.user.school,name=1).update(name=2)
      File "C:UsersFR GULIKAppDataLocalProgramsPythonPython38-32libsite-packagesdjangodbmodelsquery.py", line 784, in update
        rows = query.get_compiler(self.db).execute_sql(CURSOR)
      File "C:UsersFR GULIKAppDataLocalProgramsPythonPython38-32libsite-packagesdjangodbmodelssqlcompiler.py", line 1522, in execute_sql
        cursor = super().execute_sql(result_type)
      File "C:UsersFR GULIKAppDataLocalProgramsPythonPython38-32libsite-packagesdjangodbmodelssqlcompiler.py", line 1156, in execute_sql
        cursor.execute(sql, params)
      File "C:UsersFR GULIKAppDataLocalProgramsPythonPython38-32libsite-packagesdjangodbbackendsutils.py", line 98, in execute
        return super().execute(sql, params)
      File "C:UsersFR GULIKAppDataLocalProgramsPythonPython38-32libsite-packagesdjangodbbackendsutils.py", line 66, in execute
        return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
      File "C:UsersFR GULIKAppDataLocalProgramsPythonPython38-32libsite-packagesdjangodbbackendsutils.py", line 75, in _execute_with_wrappers
        return executor(sql, params, many, context)
      File "C:UsersFR GULIKAppDataLocalProgramsPythonPython38-32libsite-packagesdjangodbbackendsutils.py", line 84, in _execute
        return self.cursor.execute(sql, params)
      File "C:UsersFR GULIKAppDataLocalProgramsPythonPython38-32libsite-packagesdjangodbutils.py", line 90, in __exit__
        raise dj_exc_value.with_traceback(traceback) from exc_value
      File "C:UsersFR GULIKAppDataLocalProgramsPythonPython38-32libsite-packagesdjangodbbackendsutils.py", line 84, in _execute
        return self.cursor.execute(sql, params)
      File "C:UsersFR GULIKAppDataLocalProgramsPythonPython38-32libsite-packagesdjangodbbackendssqlite3base.py", line 413, in execute
        return Database.Cursor.execute(self, query, params)
    django.db.utils.IntegrityError: UNIQUE constraint failed: libman_klass.school_id, libman_klass.name
    [09/Jun/2021 11:14:57] "GET /library/move/students HTTP/1.1" 500 125470
 

Ответ №1:

Ошибка говорит вам: django.db.utils.IntegrityError: UNIQUE constraint failed: libman_klass.school_id, libman_klass.name . Это означает, что unique_together в ваших моделях возникает ошибка, когда вы пытаетесь сохранить school файл, name который уже существует в базе данных.

Например, приведенный ниже код, a Klass с school=request.user.school и name=2 уже существует, но у вас есть ограничение unique together, чтобы предотвратить это.

 Klass.objects.filter(school=request.user.school,name=1).update(name=2)
 

Если вы этого не хотите, удалите unique_together ограничение и снова запустите миграцию ( ./manage.py makemigrations ./manage.py migrate ) или, за исключением IntegrityError :

 try:
    Klass.objects.filter(
        school=request.user.school,
        name=1
    ).update(name=2)
except IntegrityError as e:
    # do something 
    messages.info(request,f'erroerd at {e}')
return redirect('/')
 

Комментарии:

1. Вам нужно удалить unique_together внутреннюю часть вашей модели и снова запустить миграцию. Или вы можете IntegrityError выбрать и справиться с этим.

2. Я обновил ответ с IntegrityError обработкой.