#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
обработкой.