IntegrityError: (1451, 'Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполнено (..))

при удалении пользователей с schedule_files я получил следующее:

IntegrityError в / admin / auth / user / 166 / delete / (1451, 'Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполнено (_1 _._ 2_, CONSTRAINT vacations_schedulefile_user_id_e85fa52f_fk_auth_user_id FOREIGN KEY (user_id) ССЫЛКИ auth_user (id))')

Мои модели:

class ScheduleFile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    added = models.DateTimeField(default=django.utils.timezone.now)

    def __str__(self):
        return '[User ID: {}] {}'.format(str(self.user.id), self.user.username)

И

class VacationEvent(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    schedule_type = models.CharField(choices=SCHEDULE_TYPES, default=STRICT_TIME, max_length=3)
    exclude_fba_from_chatzos = models.BooleanField(default=False)
    schedule_file = models.ForeignKey(ScheduleFile, on_delete=models.CASCADE, null=True)
    status = models.CharField(verbose_name="status event", choices=EVENT_STATUSES, max_length=3, default=CREATED)

И User (AbstractUser) я решил создать сигнал pre_delete и удалить относительные объекты модели расписания:

@receiver(pre_delete, dispatch_uid='User')
def user_del(sender, instance, **kwargs):
    i = instance
    events = VacationEvent.objects.filter(user_id=166)
    schedule = prefetch_related_objects(events, 'schedule_file__user')
    schedule.delete()

# instance.user.schedulefile_set.clear()
# qs = VacationEvent.objects.filter(user_id=166).prefetch_related_('schedule_file')
# qs.delete()


# b = ScheduleFile.objects.filter(user_id=166)
# e = VacationEvent.objects.filter(user_id=166)
# e.schedule_file.remove(b)

Но он возвращает «NoneType», объект не имеет атрибута «удалить». Как я могу это сделать правильно? Спасибо за любую помощь.


person Stanislav    schedule 07.12.2017    source источник


Ответы (1)


вы не можете удалить ScheduleFile, потому что его первичный ключ требуется VacationEvent, поэтому вам нужно удалить запись VacationEvent до модели ScheduleFile, это можно сделать несколькими способами, подав сигнал или переопределив функцию удаления в модели ScheduleFile

пример:

def delete(self, using=None):
    if self.schedule_file:
        self.schedule_file.delete()
    super(ScheduleFile, self).delete(using)
person Naqib Hakimi    schedule 07.12.2017