繁体   English   中英

django import-export如何添加外键

[英]django import-export how to add foreign key

我正在使用 django-import-export 将 excel 导入我的 model,我所做的是创建一个表单,其中包含加载文件的一些输入,然后在 form_valid() 中处理文件以将其加载到数据库, model 有两个外键 'id_order' 和 'gestion'; 'id_orden' 出现在 excel 和 'gestion' 我用 gestion= Gestion.objects.get(idgestion=obj.pk) 得到它,这是我保存的表单的 ID,但我想知道的是我如何可以将'gestion'传递给ModelResource,然后将其保存到数据库

view.py
class GestionView(CreateView):
    model = Gestion
    form_class = GestionForm
    template_name = 'asignacion/gestion.html'
    success_url = reverse_lazy('asignacion_url:gestion')

    def form_valid(self, form):
        isvalid = super().form_valid(form)
        obj = form.save()
        gestion= Gestion.objects.get(idgestion=obj.pk)
        file = self.request.FILES['file']
        item_gestion =ItemResourceResource()
        dataset = Dataset()
        imported_data = dataset.load(file.read(), format='xls')
        result = item_gestion.import_data(dataset, dry_run=True)
        if not result.has_errors():
            item_gestion.import_data(dataset, dry_run=False)

model.py
class ItemGestion(models.Model):
    idgestion = models.AutoField(primary_key=True)
    numero_imagenes = models.CharField(max_length=45, blank=True, null=True)
    id_orden = models.ForeignKey('Asignacion', models.DO_NOTHING)
    aviso_sap = models.CharField(max_length=45, blank=True, null=True)
    poliza = models.CharField(max_length=45, blank=True, null=True)
    observacion_cierre = models.CharField(max_length=250, blank=True, null=True)
    gestion=models.ForeignKey('Gestion', models.DO_NOTHING)

resources.py
class ItemResourceResource(resources.ModelResource):
    id_orden = fields.Field(column_name='id_orden', attribute='id_orden',
                                widget=ForeignKeyWidget(Asignacion,'id_orden'))
    
    class Meta:
        model = ItemGestion
        import_id_fields = ('id_orden',)
        exclude = ('idgestion', )

这很容易做到。 您需要将gestion值传递到您的资源中,然后在持久化之前将其链接到实例:

class ItemResourceResource(ModelResource):

    def __init__(self, gestion):
        self.gestion = gestion

    def before_save_instance(self, instance, using_transactions, dry_run):
        instance.gestion = self.gestion

    class Meta:
        # ...
gestion = Gestion.objects.get(idgestion=obj.pk)
item_gestion = ItemResourceResource(gestion)

显然,这意味着从数据集中的行创建的所有实例都将链接到相同的“gestion”值。

顺便说一句,导入导出与 django-admin 集成,因此您可以使用管理界面导入数据,而不是编写自己的 forms(如果符合您的要求)。 有关详细信息,请参阅文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM