BaseCommand для удаления данных из конкретной модели по аргументу в парсере - PullRequest
2 голосов
/ 17 апреля 2019

Мне нужна 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")

Я ожидаю пустого стола Магазин.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Попробуйте это

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")

Refs:
1. Джанго: Получить модель из строки?
2. apps.get_model(app_label, model_name, require_ready=True) - Django Doc

1 голос
/ 17 апреля 2019

Что вам нужно, это get_model.Вы можете получить модель по названию модели, указанному get_model.Например:

Для Джанго <1,9: </p>

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")

Для Джанго> = 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...