Introduce a Django management command to populate the `slug` field for Product instances where it is null. The command processes products in batches, handles errors gracefully, and logs issues for troubleshooting.
31 lines
1.1 KiB
Python
31 lines
1.1 KiB
Python
import logging
|
|
|
|
from django.core.management.base import BaseCommand
|
|
from django.db import transaction
|
|
from core.models import Product
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = "Populate slug field for all Product instances"
|
|
|
|
def handle(self, *args, **options):
|
|
qs = Product.objects.filter(slug__isnull=True)
|
|
total = qs.count()
|
|
self.stdout.write(f"Starting slug population for {total} products")
|
|
|
|
for idx, product in enumerate(qs.iterator(), start=1):
|
|
try:
|
|
product.slug = None
|
|
with transaction.atomic():
|
|
product.save(update_fields=["slug"])
|
|
|
|
self.stdout.write(
|
|
self.style.SUCCESS(f"[{idx}/{total}] (Product ID: {product.pk}) slug set to '{product.slug}'")
|
|
)
|
|
except Exception as e:
|
|
logger.exception(f"Product {product.pk}: slug population failed")
|
|
self.stderr.write(self.style.ERROR(f"[{idx}/{total}] (Product ID: {product.pk}) ERROR: {e}"))
|
|
|
|
self.stdout.write(self.style.SUCCESS("Slug population complete."))
|