我现在编写了一个 Django 命令,它首先检查我想要获取哪些 pks,以及它们有哪些子项,以获取所有相关对象。
import logging
import os
from django.core.management import BaseCommand, call_command
logger = logging.getLogger(__name__)
A = {'pk1', 'pk2', 'pk3'}
class Command(BaseCommand):
def __init__(self, stdout=None, stderr=None, no_color=False):
super().__init__(stdout, stderr, no_color)
self.settings = None
self.a = set()
@property
def tmp_dir(self):
return '/tmp'
def handle(self, *args, **options):
self.settings = options.get('settings')
# TODO: Make list of A an optional argument
a_pks = A
self.dump_objects('ca_myapp.A', pks=a_pks)
b_pks = B.objects.filter(a_id__in=a_pks).values_list('pk', flat=True)
self.dump_objects('ca_myapp.B', pks=b_pks)
c_pks = C.objects.filter(b_id__in=b_pks).values_list('pk', flat=True)
self.dump_objects('ca_myapp.C', pks=c_pks)
def dump_objects(self, model_name: str, pks: set):
if pks:
call_command('dumpdata', model_name,
'--pks', ','.join(pks),
'--indent', '2',
'-o', os.path.join(self.tmp_dir, '{}.json'.format(model_name)),
'--settings', self.settings)
else:
logger.warning('No objects for model {} found'.format(model_name))