Last active
July 19, 2022 17:55
-
-
Save godd0t/99b859862ae44f1142cf37ab11121626 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 | |
# 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