Django - Ограничение FOREIGN KEY не сработало
В этой части кода для синхронизации листа excel с базой данных:
for record in lesson_records:
try:
date = parser.parse(record['Date']).date()
start_time = parser.parse(record['Start Time']).time()
end_time = parser.parse(record['End Time']).time()
primary_tutor = get_object_or_404(Staff, gmail=record['Primary Tutor Email'])
logger.info(primary_tutor)
course = get_object_or_404(Course, course_code=record['Course Code'])
logger.info(course)
lesson, created = Lesson.objects.update_or_create(
lesson_code=record['Lesson Code'],
defaults={
'course_code': course,
'date': date,
'start_time': start_time,
'end_time': end_time,
'lesson_no': record['Lesson Number'],
'school': record['School / Customer'],
'teacher': record['Teacher'],
'teacher_contact': record['Teacher Contact'],
'venue': record['Venue'],
'remarks': record['Remark'],
'delivery_format': record['Delivery Format'],
'primary_tutor': primary_tutor
}
)
logger.info(record['Lesson Code'])
except Exception as e:
lesson_errors.append(f"Error in Lesson {record['Lesson Code']}: {str(e)}")
logger.error(f"Error in {record['Lesson Code']}: {str(e)}")
Я получаю Error in [course code]: FOREIGN KEY constraint failed
за каждый курс.
И primary_tutor
, и course
корректно регистрируются, поэтому оба get_object_or_404
успешно работают и оба существуют в базе данных, но ограничение внешнего ключа все равно не работает.
Это модель:
class Lesson(models.Model):
course_code = models.ForeignKey(Course, on_delete=models.CASCADE)
date = models.DateField()
start_time = models.TimeField()
end_time = models.TimeField()
lesson_no = models.IntegerField()
lesson_code = models.CharField(max_length=20, primary_key=True)
school = models.CharField(max_length=100)
teacher = models.CharField(max_length=10)
teacher_contact = models.CharField(max_length=100)
teacher_email = models.EmailField(blank=True, null=True)
venue = models.CharField(max_length=100)
remarks = models.TextField(blank=True, null=True)
delivery_format = models.CharField(max_length=10)
primary_tutor = models.ForeignKey(Staff, on_delete=models.CASCADE, related_name='primary_tutor')
other_tutors = models.ManyToManyField(Staff)
calender_id = models.CharField(max_length=100, blank=True, null=True)
change = models.BooleanField(default=False)
Я уже сбросил базу данных и сделал makemigrations
и migrate
снова, все равно не работает.
По умолчанию Django создает файлы миграции в алфавитном порядке имен моделей. В вашем случае это будет порядок : Курс, Урок и затем Персонал. Но когда он пытается создать отношение к таблице appname_staff при создании миграции для модели Lesson, он терпит неудачу, потому что таблицы с таким именем не существует. Поэтому я рекомендую вам сначала закомментировать поля, в которых вы связываетесь с моделью материала, а затем сделать миграцию. После этого вы должны откомментировать эти строки и сделать миграцию с отношениями к EXISTING таблице.