【问题标题】:IntegrityError: (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (..))IntegrityError:(1451,'无法删除或更新父行:外键约束失败(..))
【发布时间】:2018-05-21 18:47:51
【问题描述】:

使用 schedule_files 删除用户时,我得到了这个:

IntegrityError at /admin/auth/user/166/delete/ (1451, '无法删除或更新父行:外键约束失败 (vacation.vacations_schedulefile, CONSTRAINT vacations_schedulefile_user_id_e85fa52f_fk_auth_user_id FOREIGN KEY (user_id) REFERENCES 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)

和用户(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”对象没有“删除”属性。我怎样才能做到正确?感谢您的帮助。

【问题讨论】:

    标签: python django admin m2m


    【解决方案1】:

    您不能删除 ScheduleFile,因为它的主键是 VacationEvent 所以你必须在 ScheduleFile 模型,这可以通过信号或覆盖以多种方式完成 ScheduleFile 模型上的删除函数

    示例:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 2022-09-23
      • 2020-08-10
      • 2017-06-11
      • 1970-01-01
      相关资源
      最近更新 更多