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
, CONSTRAINTvacations_schedulefile_user_id_e85fa52f_fk_auth_user_id
FOREIGN KEY (user_id
) REFERENCESauth_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.