Last active
July 19, 2022 18:30
-
-
Save godd0t/38a19f92cac146de6d63939512de65d9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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