自定义 Django 管理命令

nci*_*ica 1 python django

这个想法是通过接受命令行选项来删除对象:

  • 可以通过ID删除对象
  • 按日期范围

预期行为,新的自定义命令调用使用:

python manage.py delete_obj --delete id 1234
Run Code Online (Sandbox Code Playgroud)

或者

python manage.py delete_obj --delete from 2019/10/01 to 2019/12/12
Run Code Online (Sandbox Code Playgroud)

第一部分的代码:

from django.core.management.base import BaseCommand
from ...models import SomeObject

class Command(BaseCommand):

    def add_arguments(self, parser):
        parser.add_argument('id', type=int)

        parser.add_argument(
            '--delete',
            default = False,
            help='Delete product',
        )

    def handle(self, *args, **options):

        if options['delete']:
            if options['id']:

                SomeObject.delete()
Run Code Online (Sandbox Code Playgroud)

我在 id 的 add_arguments() 方法中添加了一个自定义选项。如何定义要按 ID 或按日期范围删除的对象?

JPG*_*JPG 5

像这样的东西:

class Command(BaseCommand):

    def add_arguments(self, parser):
        parser.add_argument('--id', type=int)
        parser.add_argument('--date_from')
        parser.add_argument('--date_to')

    def handle(self, *args, **options):
        if options['id']:
            try:
                instance = SampleModel.objects.get(id=options['id'])
                instance.delete()
                self.stdout.write(self.style.SUCCESS('Object Deleted'))
            except SampleModel.DoesNotExist:
                self.stdout.write(self.style.ERROR('Object not found'))
        elif options['date_from'] and options['date_to']:
            date_range = [options['date_from'], options['date_to']]
            SampleModel.objects.filter(datetime_field__range=date_range).delete()
            self.stdout.write(self.style.SUCCESS('Objects Deleted'))
        else:
            self.stdout.write(self.style.ERROR('options are not given'))
Run Code Online (Sandbox Code Playgroud)

用法:

python manage.py command_name --id 123
python manage.py command_name --date_from 2012-12-12 --date_to 2013-12-12
Run Code Online (Sandbox Code Playgroud)

基本思想是,您可以将任意数量的参数传递给 Django 命令,并且 Django 能够将输入值类型转换为任何本机 Python 数据类型

  • 由于您的命令 (`delete_obj`) 是不言自明的,因此您不需要添加 **`--delete`** 标志。 (2认同)