简体   繁体   中英

IntegrityError: (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (..))

when deleting users with schedule_files I got this:

IntegrityError at /admin/auth/user/166/delete/ (1451, 'Cannot delete or update a parent row: a foreign key constraint fails ( vacation . vacations_schedulefile , CONSTRAINT vacations_schedulefile_user_id_e85fa52f_fk_auth_user_id FOREIGN KEY ( user_id ) REFERENCES auth_user ( id ))')

My models are:

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)

And

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)

And User(AbstractUser) I decided to create pre_delete signal and delete relative objects of schedule model:

@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)

But it returns 'NoneType' object has no attribute 'delete'. How can I do it right? Thanks for any help.

you can not delete ScheduleFile because it's primary key is required by VacationEvent so you have to delete VacationEvent record before the ScheduleFile model this can be done in several way by signal or overriding delete function on ScheduleFile model

example:

def delete(self, using=None):
    if self.schedule_file:
        self.schedule_file.delete()
    super(ScheduleFile, self).delete(using)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM