【发布时间】:2020-03-10 03:51:30
【问题描述】:
我对 django 很陌生,需要帮助和想法找到正确的方法。简而言之,我有一个模型,该模型每年从 CSV 文件中填充几次(删除所有信息并用新的表单文件替换它)。为此 - 我编写了从 shell 运行的脚本。它有效,但不方便,我不能让别人去做。我想升级并使该脚本可从admin 页面调用。到目前为止是这样的:
要上传 CSV 文件,我为它创建了模型(models.py):
class DrgDuomenys(models.Model):
drg_duomenys = models.FileField(upload_to='DRG_csv/')
data = models.DateField(auto_now=False, auto_now_add=True)
应该填充的模型(也在models.py中):
class DRGkodas(models.Model):
drg_kodas = models.CharField(max_length=4)
drg_koeficientas = models.DecimalField(max_digits=6, decimal_places=3)
drg_skaicius = models.IntegerField()
def __str__(self):
return self.drg_kodas
用于填充模型的旧脚本(名为 ikelti_drg.py),通过写入 py manage.py ikelti_DRG --path path/to/your/file.csv 从 shell 激活
导入 csv 从 django.core.management 导入 BaseCommand 从 stv.models 导入 DRGkodas,DrgDuomenys
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument('--path', type=str)
def handle(self, *args, **kwargs):
path = kwargs['path']
with open(path, 'rt') as f:
reader = csv.reader(f, dialect='excel')
for row in reader:
drg_kodai = DRGkodas.objects.create(
drg_kodas = str(row[0]),
drg_koeficientas = float(row[1]),
drg_skaicius = int(row[2]),
)
我尝试编辑它以使用数据库中的 CSV 来简化流程,所以我编辑的脚本应该可以从 admin 页面调用(可能不正确,所以这里的任何帮助也将不胜感激):
import csv
from django.core.management import BaseCommand
from stv.models import DRGkodas, DrgDuomenys
class LoadDrg(BaseCommand):
#Load DRG duomenų csv file into the database
data = DrgDuomenys.objects.latest('data')
data_file = data.drg_duomenys
def handle(self, *args, **kwargs):
with open(data_file) as f:
reader = csv.reader(f, dialect='excel')
for row in reader:
drg_kodai = DRGkodas.objects.create(
drg_kodas = str(row[0]),
drg_koeficientas = float(row[1]),
drg_skaicius = int(row[2]),
)
最后,我在admin.py 中修改了注册的DRGkodas 模块以包含这样的新烘焙操作:
from stv.management.commands.ikelti_DRG_admin import LoadDrg
class DRGkodaiAdmin(admin.ModelAdmin):
list_display = ('drg_kodas', 'drg_koeficientas', 'drg_skaicius')
actions = ['paskelbti_drg_info',]
def paskelbti_drg_info(self, request):
uzpildyti_drg = [LoadDrg]
paskelbti_drg_info.short_description = "Upload new info"
admin.site.register(DRGkodas, DRGkodaiAdmin)
现在的问题是,要调用操作我必须选择至少一个条目(应该没有,因为我正在尝试创建它们)如果我创建虚拟条目并选择它来运行命令,它(显然)不起作用。
我的主要问题是什么 - 正确的方法?起初我想我应该把按钮放在管理页面的某个地方,但经过一些研究,我没有找到任何可靠的方法去做。所以我尝试直接向模型添加动作(我上面的代码),但这与我需要的有点不同。
请给我一些关于我应该使用什么方法的建议,任何文献或示例代码 sn-p 将不胜感激。
【问题讨论】:
标签: python django django-models django-admin django-admin-actions