--- title: Recovering deleted Wagtail pages and Django models class: text-center highlighter: shiki transition: slide-left mdc: true themeConfig: primary: '#fd5765' addons: - "slidev-addon-qrcode" --- # Recovering [deleted]{style="color: #fd5765"} Wagtail pages and Django models ### Jake Howard{style="color: #e85537;" } --- layout: cover background: https://cdn.jsdelivr.net/gh/wagtail/wagtail@main/.github/wagtail-screenshot-with-browser.png --- # Setting the scene --- layout: cover --- # Site history report --- layout: section --- # Restoring from backups --- layout: section --- # _Partial_ restores 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 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. # Deserialize --- 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: section --- #### 5. ### Test ## Test # **Test!** --- layout: image-right image: /red-button.png class: flex justify-center flex-col items-center --- ### 6. # Showtime! --- layout: cover background: https://cdn.jsdelivr.net/gh/wagtail/wagtail@main/.github/wagtail-screenshot-with-browser.png --- # Conclusion --- layout: end --- END