我对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
激活的
导入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,**kwargs):
with open(data_file) as f:
reader = csv.reader(f,)
最后,我修改了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)
现在的问题是,要调用动作,我必须至少选择一个条目(并且应该没有任何条目,因为我正在尝试创建它们),如果我创建了虚拟条目并选择它以使命令运行,它也会(显然)不起作用。
我的主要问题是什么-正确的方法?起初,我以为我应该在管理页面上放置按钮,但是经过一番研究后,我发现关于如何去做。因此,我尝试将动作直接添加到模型中(上面的代码),但这与我需要的工作有点不同。
请给我一些有关我应该使用哪种方法的建议,也非常感谢任何文献或示例代码片段。