用于通过解析器中的参数从特定模型中删除数据的 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