我对 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
用于填充模型的旧脚本(名为),shell
通过写入激活py manage.py ikelti_DRG --path path/to/your/file.csv
从 django.core.management 导入 csv 从 stv.models 导入 BaseCommand 导入 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]),
)
最后,我修改了已注册DRGkodas
的模块,admin.py
以包含这样的新烘焙操作:
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)
现在的问题是,要调用操作我必须选择至少一个条目(应该没有,因为我正在尝试创建它们),如果我创建虚拟条目并选择它来运行命令,它(显然)不工作。
我的主要问题是什么-正确的方法是什么?起初我想我应该把按钮放在管理页面的某个地方,但经过一些研究,我没有找到任何关于如何做到这一点的可靠信息。所以我尝试直接向模型添加动作(我上面的代码),但这与我需要的有点不同。
请就我应该使用什么方法给我一些建议,任何文献或示例代码片段也将不胜感激。