这个想法是通过接受命令行选项来删除对象:
预期行为,新的自定义命令调用使用:
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 或按日期范围删除的对象?
像这样的东西:
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 数据类型。
| 归档时间: |
|
| 查看次数: |
1579 次 |
| 最近记录: |