--- 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} --- 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/