---
title: Recovering deleted Wagtail pages and Django models
class: text-center
highlighter: shiki
transition: slide-left
mdc: true
themeConfig:
primary: '#fd5765'
---
# Recovering [deleted]{style="color: #fd5765"} Wagtail pages and/or Django models
### Jake Howard{.mt-10}
- Senior Systems Engineer @ Torchbox
- Core Team, Security Team & Performance Working Group @ Wagtail
- theorangeone.net
- @RealOrangeOne
- @RealOrangeOne
- @jake@theorangeone.net
---
layout: cover
background: /intranet.png
---
# Setting the scene
---
layout: cover
background: /site-history.png
---
# Site history report
---
layout: image
image: /chat.png
backgroundSize: contain
---
---
layout: section
---
# Restoring from backups
---
layout: section
---
# _Partially_ restoring from backups
---
layout: section
---
## 1.
# Spin up a database backup
---
layout: section
---
## 2.
# Locate the page models
```python
from wagtail.models import Page
sysadmin_page = Page.objects.get(id=91)
child_pages = sysadmin_page.get_descendants()
```
---
layout: section
---
## 3.
# Locate what was deleted
```python
from django.contrib.admin.utils import NestedObjects
collector = NestedObjects()
collector.collect(list(child_pages) + [sysadmin_page])
```
---
layout: section
---
## 4.
# Serialize
```python {all|3-5}
from django.core import serializers
class NoM2MSerializer(Serializer):
def handle_m2m_field(self, obj, field):
pass
def get_model_instances():
for qs in collector.data.values():
yield from qs
with open("deleted-models.json", "w") as f:
NoM2MSerializer().serialize(
get_model_instances(),
stream=f
)
```
---
layout: section
---
## 4a.
# [De]{.italic}serialize
### `manage.py loaddata`
---
layout: center
---
# `restore-deleted-pages.py`
```python {all}{lines:true}
from django.contrib.admin.utils import NestedObjects
from django.core import serializers
from wagtail.models import Page
class NoM2MSerializer(Serializer):
def handle_m2m_field(self, obj, field):
pass
sysadmin_page = Page.objects.get(id=91)
child_pages = sysadmin_page.get_descendants()
collector = NestedObjects()
collector.collect(list(child_pages) + [sysadmin_page])
def get_model_instances():
for qs in collector.data.values():
yield from qs
with open("deleted-models.json", "w") as f:
NoM2MSerializer().serialize(
get_model_instances(),
stream=f
)
```
---
layout: fact
---
### 5.
# **Test!**
---
layout: image-right
image: /red-button.png
class: flex justify-center flex-col items-center
---
### 6.
# Showtime!
1. Backup! ✅
2. Send `deleted-models.json` to server ✅
3. `loaddata` ✅
4. `checktree` ✅
5. `update_index` ✅
6. `rebuild_reference_index` ✅
---
layout: cover
background: /sysadmin.png
---
# Conclusion
---
layout: end
---
https://wagtail.org/blog/recovering-deleted-pages-and-models/