Django импорт-экспорт как добавить ключ foreing
Я использую django-import-export для импорта excel в мою модель, что я делаю, так это создаю форму с некоторыми входами, откуда она загружает файл, затем в form_valid() я обрабатываю файл, чтобы загрузить его в базу данных, модель имеет два внешних ключа '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'.
btw import-export интегрируется с django-admin, поэтому вы можете использовать интерфейс администратора для импорта данных, а не писать собственные формы (если это соответствует вашим требованиям). Дополнительную информацию смотрите в docs.