Skip to content

Instantly share code, notes, and snippets.

@godd0t
Last active July 19, 2022 18:30
Show Gist options
  • Save godd0t/38a19f92cac146de6d63939512de65d9 to your computer and use it in GitHub Desktop.
Save godd0t/38a19f92cac146de6d63939512de65d9 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
@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:
# Iterate over all objects, including related objects
collector = NestedObjects(using="default")
# Collect all objects to be exported
collector.collect(queryset)
objects = list(chain.from_iterable(collector.data.values()))
# New
# Add use_natural_foreign_keys, use_natural_primary_keys
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):
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