توی جنگو میشه برای یک app کامند کاستوم custom command نوشت. use case های زیادی میتونه داشته باشه. فرض کنیم یه model داریم به اسم campaign که مربوط به قرعه کشی هایی هست که توی وبسایت فروشگاهمون وجود داره. این کمپین فقط عید نوروز فعاله و یه فیلد داره به اسم active که برابر با true میشه. حالا بعد از نوروز میخایم اون رو غیرفعال کنیم بهتره که بتونیم با یه کامند این تغییر رو توی دیتابیس بدیم.
برای این کار یک کامند برای campaign app میسازیم. از این به بعد هر پروژه ای که این app را به INSTALLED_APP اضافه کنه این کامند رو هم خواهد داشت. برای این کار باید توی app مورد نظر یه package با ساختار زیر بسازیم.
1 2 3 4 5 6 7 8 9 10 11 |
campaigne/ __init__.py models.py management/ __init__.py commands/ __init__.py _private.py campaigne.py tests.py views.py |
توی فایل campaigneactivation.py باید یه کلاس به اسم Command بسازیم که از کلاس BaseCommand ارث بری میکنه.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
from django.core.management.base import BaseCommand, CommandError from campaigne.models import Question as Campaigne class Command(BaseCommand): help = "Deactive/active campaigne" def add_arguments(self, parser): parser.add_argument("campaigne_ids", nargs="+", type=int) def handle(self, *args, **options): for c_id in options["campaigne_ids"]: try: campaigne = Campaigne.objects.get(pk=campaigne_ids) except Campaigne.DoesNotExist: raise CommandError('campaigne "%s" does not exist' % campaigne_ids) campaigne.opened = False campaigne.save() self.stdout.write( self.style.SUCCESS('Successfully closed campaigne "%s"' % campaigne_ids) ) |
این کامند الان اضافه شده و میشه به شکل زیر ازش استفاده کرد.
1 |
python manage.py campaigne 124 |
کلاس BaseCommand پارامترهای زیادی داره که جزئیاتش تو این لینک هست