python / expert
Snippet
Django Management Command mit Fortschrittsbalken und stilisiertem Output
Django Management Commands bieten eine leistungsstarke Möglichkeit zur Interaktion mit Ihrer Anwendung über die Kommandozeile. Dieses Beispiel demonstriert fortgeschrittene Features einschließlich chunked Querysets für speichereffiziente Batch-Verarbeitung, Fortschrittsbalken-Visualisierung, Dry-Run-Modus für sicheres Testen und stilisierten Terminal-Output mit Djangos eingebauten Farb-Styles. Diese Muster sind unerlässlich für Datenmigrations-Befehle, Bulk-Operationen und Wartungs-Skripte.
snippet.py
1
from django.core.management.base import BaseCommand\nfrom django.core.management.color import no_style\nfrom django.db import connection\nfrom myapp.models import Product\n\nclass Command(BaseCommand):\n help = 'Rebuild product search index'\n\n def add_arguments(self, parser):\n parser.add_argument('--batch-size', type=int, default=500)\n parser.add_argument('--dry-run', action='store_true')\n\n def handle(self, *args, **options):\n batch_size = options['batch_size']\n dry_run = options['dry_run']\n total = Product.objects.count()\n\n self.stdout.write(self.style.SUCCESS(f'Starting indexing: {total} products'))\n self.stdout.write('---')\n\n processed = 0\n failed = 0\n\n for batch in self._chunked_queryset(Product.objects.all(), batch_size):\n for product in batch:\n try:\n self._index_product(product, dry_run)\n processed += 1\n except Exception as e:\n failed += 1\n self.stdout.write(\n self.style.ERROR(f'Failed: {product.sku} - {e}')\n )\n\n self._progress_bar(processed, total)\n\n self.stdout.write('')\n self.stdout.write(self.style.SUCCESS(\n f'Completed: {processed} indexed, {failed} failed'\n ))\n\n def _chunked_queryset(self, queryset, chunk_size):\n offset = 0\n while True:\n chunk = list(queryset[offset:offset + chunk_size])\n if not chunk:\n break\n yield chunk\n offset += chunk_size\n\n def _progress_bar(self, current, total):\n bar_length = 40\n percent = current / total if total else 1\n filled = int(bar_length * percent)\n bar = '█' * filled + '░' * (bar_length - filled)\n self.stdout.write(f'\r[{bar}] {current}/{total}', ending='')\n self.stdout.flush()
django
Erklärung
1
class Command(BaseCommand):
Basis-Klasse, die Standard-Django-Management-Command-Infrastruktur mit Argument-Parsing und Output-Styling bietet
2
parser.add_argument('--dry-run', action='store_true')
Boolean-Flag-Argument, das sicheren Testmodus aktiviert, der alle Logik ausführt ohne Datenbankänderungen zu persistieren
3
for batch in self._chunked_queryset(...):
Speichereffizienter Iterator, der geteilte Querysets ausgibt, um zu vermeiden, dass Millionen von Datensätzen gleichzeitig in den Speicher geladen werden
4
self.style.ERROR() / self.style.SUCCESS()
Eingebaute Terminal-Farb-Styling-Helfer, die automatisch NO_COLOR Env Var und Terminal-Fähigkeiten respektieren