manage.py؛ کنترل پنل خط فرمان پروژه
manage.py همان django-admin است که از قبل DJANGO_SETTINGS_MODULE را روی تنظیمات پروژهی شما گذاشته. هر کاری که «یک بار» یا «زمانبندیشده» انجام میشود — ساخت ادمین، پاکسازی داده، ورود اکسل — جایش یک دستور مدیریتی است، نه یک View مخفی.
دستورهایی که هر روز لازم دارید
| دستور | کاربرد |
|---|---|
runserver 0.0.0.0:8000 | سرور توسعه؛ با 0.0.0.0 از گوشی در همان شبکه هم باز میشود |
makemigrations / migrate | ساخت و اجرای migration (فصل ۲) |
createsuperuser | ساخت کاربر مدیر |
shell | پایتون تعاملی با تنظیمات پروژه |
dbshell | کلاینت خط فرمان همان پایگاه داده (psql، sqlite3) |
check / check --deploy | بررسی خطاهای پیکربندی و امنیتی |
dumpdata / loaddata | خروجی و ورودی JSON دادهها |
collectstatic | جمعکردن فایلهای static برای سرور |
changepassword 09121234567 | عوض کردن رمز یک کاربر |
sendtestemail you@example.ir | آزمون سریع تنظیمات ایمیل |
یک دستور اختصاصی: لغو سفارشهای رهاشده
فایل باید در مسیر apps/orders/management/commands/ باشد (هر دو پوشه با __init__.py) و نام فایل، نام دستور میشود:
# apps/orders/management/commands/cancel_stale_orders.py
from datetime import timedelta
from django.core.management.base import BaseCommand
from django.utils import timezone
from apps.orders.models import Order
class Command(BaseCommand):
help = "سفارشهای پرداختنشدهی قدیمیتر از N روز را لغو میکند"
def add_arguments(self, parser):
parser.add_argument("--days", type=int, default=3)
parser.add_argument("--dry-run", action="store_true")
def handle(self, *args, **opts):
limit = timezone.now() - timedelta(days=opts["days"])
qs = Order.objects.filter(status="pending", created_at__lt=limit)
count = qs.count()
if opts["dry_run"]:
self.stdout.write(f"{count} سفارش لغو خواهد شد (آزمایشی).")
return
qs.update(status="cancelled")
self.stdout.write(self.style.SUCCESS(f"{count} سفارش لغو شد."))
python manage.py cancel_stale_orders --days 5 --dry-run
python manage.py cancel_stale_orders --days 5
روی سرور همین دستور را با cron یا systemd timer زمانبندی میکنید؛ در کد هم با django.core.management.call_command("cancel_stale_orders", days=5) قابل صدا زدن است (مثلاً داخل تست).
نکتههایی که کمتر کسی میداند
- در Django 5.2 دستور
shellهمهی مدلهای اپهای نصبشده را خودکار import میکند؛ دیگر لازم نیست هر بارfrom apps.orders.models import Orderبنویسید. python manage.py shell -c "..."یک خط کد را بدون ورود به محیط تعاملی اجرا میکند؛ برای اسکریپتهای سریع روی سرور عالی است.- در PowerShell خروجی
dumpdata > data.jsonرا با UTF-16 مینویسد و loaddata بعداً خطا میدهد؛ بهجایش از گزینهی-o data.jsonخود دستور استفاده کنید. - برای dumpdata قابلانتقال از
--natural-foreign -e contenttypes -e auth.permissionاستفاده کنید؛ وگرنه روی پایگاه دادهی تازه به خطای تکراری بودن کلید برمیخورید. - نام گزینهی
--dry-runدرoptsبا زیرخط (dry_run) میآید؛ این رفتار argparse است و منشأ یک KeyError رایج.