Django 如何通过字符串引用模型列?
我正在生成一个终端命令,用户在其中输入两个字符串。一个对应于模型,另一个对应于该模型中的列Django 如何通过字符串引用模型列?,django,django-models,Django,Django Models,我正在生成一个终端命令,用户在其中输入两个字符串。一个对应于模型,另一个对应于该模型中的列 class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument( "--model", dest="model", required=True, ) def add_arguments(se
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument(
"--model",
dest="model",
required=True,
)
def add_arguments(self, parser):
parser.add_argument(
"--col",
dest="col",
required=True,
)
def handle(self, *args, **options):
# Handle stuff here
我知道我可以从django.apps导入应用程序,并在apps.get_model中放置选项[model],以获取用户输入的模型实例,假设它存在。但是如何引用用户在options[col]中输入的列呢?首先,您应该删除重复的add\u参数方法。其次,您应该要求应用程序的名称,因为如果两个不同的应用程序共享相同的型号名称,会发生什么情况?如果这些相同的命名模型共享相同的字段名呢。此命令应应用于哪列 下面是一个接受应用程序参数的工作命令:
from django.core.management.base import BaseCommand, CommandError
from django.core.exceptions import FieldDoesNotExist
from django.apps import apps
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument(
"--app",
dest="app",
required=True,
)
parser.add_argument(
"--model",
dest="model",
required=True,
)
parser.add_argument(
"--col",
dest="col",
required=True,
)
def handle(self, *args, **options):
app_label = options.get('app')
model_name = options.get('model')
column_name = options.get('col')
try:
model = apps.get_model(app_label=app_label, model_name=model_name)
except LookupError as e:
msg = 'The model "%s" under the app "%s" does not exist!' \
% (model_name, app_label)
raise CommandError(msg)
try:
column = model._meta.get_field(column_name)
except FieldDoesNotExist as e:
msg = 'The column "%s" does not match!' % column_name
raise CommandError(msg)
else:
print(column, type(column))
# Do stuff here with the column, model.