Skip to content

Instantly share code, notes, and snippets.

@godd0t
Last active July 19, 2022 17:55
Show Gist options
  • Save godd0t/99b859862ae44f1142cf37ab11121626 to your computer and use it in GitHub Desktop.
Save godd0t/99b859862ae44f1142cf37ab11121626 to your computer and use it in GitHub Desktop.
import tempfile
from itertools import chain
from django.contrib import admin
from django.contrib.admin.utils import NestedObjects
from django.core import serializers
from django.http import HttpResponse
from example_app.models import *
@admin.action(description="Export Model")
def export_model(modeladmin, request, queryset):
model_file = tempfile.TemporaryFile()
with model_file as tmp_file:
serialized_objects = serializers.serialize(
"json", queryset
)
tmp_file.write(serialized_objects.encode("utf-8"))
tmp_file.seek(0)
response = HttpResponse(tmp_file.read(), content_type="application/json")
response["Content-Disposition"] = "attachment; filename=model.json"
return response
# New
@admin.action(description="Export Model with related objects")
def export_model_with_related_objects(modeladmin, request, queryset):
data_model_file = tempfile.TemporaryFile()
with data_model_file as tmp_file:
collector = NestedObjects(using="default")
collector.collect(queryset)
objects = list(chain.from_iterable(collector.data.values()))
serialized_objects = serializers.serialize(
"json", objects, use_natural_foreign_keys=True, use_natural_primary_keys=True
)
tmp_file.write(serialized_objects.encode("utf-8"))
tmp_file.seek(0)
response = HttpResponse(tmp_file.read(), content_type="application/json")
response["Content-Disposition"] = "attachment; filename=model_with_related_objects.json"
return response
class PersonAdmin(admin.ModelAdmin):
# New
actions = [export_model, export_model_with_related_objects]
admin.site.register(Person, PersonAdmin)
admin.site.register(Book)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment