用于通过解析器中的参数从特定模型中删除数据的 BaseCommand
BaseCommand for delete data from specific model by argument in parser
我需要一个 BaseCommand 来删除参数中指定模型的条目。
运行 这个:
./manage.py delete_data_model app.shop
# delete_data_model.py
from django.core.management.base import BaseCommand, CommandError
from django.db.transaction import atomic
class Command(BaseCommand):
help = "Deleted data from model"
def add_arguments(self, parser):
parser.add_argument('model', required=True, type=str)
def handle(self, *args, **options):
self.stdout.write("Begin")
with atomic(using='default'):
try:
path = options['model']
app, model = path.split('.')[:2]
from (app) import (model) as Model # ??? how do this
Model.objects.all().delete()
except Exception as e:
raise CommandError("Error {}".format(e))
self.stdout.write("Complete")
我预计空 table 店。
您需要的是get_model
。您可以从使用 get_model
指定的模型名称中获取模型。例如:
对于 Django < 1.9:
from django.db.models.loading import get_model
mymodel = get_model('app_name', 'model_name')
因此您可以将方法更改为:
def handle(self, *args, **options):
self.stdout.write("Begin")
with atomic(using='default'):
try:
path = options['model']
app, model = path.split('.')[:2]
mymodel = get_model(app, model) <--get model from string argument
mymodel.objects.all().delete()
except Exception as e:
raise CommandError("Error {}".format(e))
self.stdout.write("Complete")
对于 Django >= 1.9:
from django.apps import apps
mymodel = apps.get_model('app_name', 'model_name')
因此您可以将方法更改为:
def handle(self, *args, **options):
self.stdout.write("Begin")
with atomic(using='default'):
try:
path = options['model']
app, model = path.split('.')[:2]
mymodel = apps.get_model(app, model) <--get model from string argument
mymodel.objects.all().delete()
except Exception as e:
raise CommandError("Error {}".format(e))
self.stdout.write("Complete")
试试这个
from django.core.management.base import BaseCommand, CommandError
from django.db.transaction import atomic
<b>from django.apps import apps</b>
class Command(BaseCommand):
help = "Deleted data from model"
def add_arguments(self, parser):
parser.add_argument('model', required=True, type=str)
def handle(self, *args, **options):
self.stdout.write("Begin")
with atomic(using='default'):
try:
path = options['model']
app, model = path.split('.')[:2]
<b>Model = apps.get_model(app_label=app, model_name=model)</b>
Model.objects.all().delete()
except Exception as e:
raise CommandError("Error {}".format(e))
self.stdout.write("Complete")
参考资料:
1. Django: Get model from string?
2.apps.get_model(app_label, model_name, require_ready=True)
-- Django Doc
我需要一个 BaseCommand 来删除参数中指定模型的条目。
运行 这个:
./manage.py delete_data_model app.shop
# delete_data_model.py
from django.core.management.base import BaseCommand, CommandError
from django.db.transaction import atomic
class Command(BaseCommand):
help = "Deleted data from model"
def add_arguments(self, parser):
parser.add_argument('model', required=True, type=str)
def handle(self, *args, **options):
self.stdout.write("Begin")
with atomic(using='default'):
try:
path = options['model']
app, model = path.split('.')[:2]
from (app) import (model) as Model # ??? how do this
Model.objects.all().delete()
except Exception as e:
raise CommandError("Error {}".format(e))
self.stdout.write("Complete")
我预计空 table 店。
您需要的是get_model
。您可以从使用 get_model
指定的模型名称中获取模型。例如:
对于 Django < 1.9:
from django.db.models.loading import get_model
mymodel = get_model('app_name', 'model_name')
因此您可以将方法更改为:
def handle(self, *args, **options):
self.stdout.write("Begin")
with atomic(using='default'):
try:
path = options['model']
app, model = path.split('.')[:2]
mymodel = get_model(app, model) <--get model from string argument
mymodel.objects.all().delete()
except Exception as e:
raise CommandError("Error {}".format(e))
self.stdout.write("Complete")
对于 Django >= 1.9:
from django.apps import apps
mymodel = apps.get_model('app_name', 'model_name')
因此您可以将方法更改为:
def handle(self, *args, **options):
self.stdout.write("Begin")
with atomic(using='default'):
try:
path = options['model']
app, model = path.split('.')[:2]
mymodel = apps.get_model(app, model) <--get model from string argument
mymodel.objects.all().delete()
except Exception as e:
raise CommandError("Error {}".format(e))
self.stdout.write("Complete")
试试这个
from django.core.management.base import BaseCommand, CommandError
from django.db.transaction import atomic
<b>from django.apps import apps</b>
class Command(BaseCommand):
help = "Deleted data from model"
def add_arguments(self, parser):
parser.add_argument('model', required=True, type=str)
def handle(self, *args, **options):
self.stdout.write("Begin")
with atomic(using='default'):
try:
path = options['model']
app, model = path.split('.')[:2]
<b>Model = apps.get_model(app_label=app, model_name=model)</b>
Model.objects.all().delete()
except Exception as e:
raise CommandError("Error {}".format(e))
self.stdout.write("Complete")
参考资料:
1. Django: Get model from string?
2.apps.get_model(app_label, model_name, require_ready=True)
-- Django Doc