Передача идентификатора внешнего ключа через URL в импортированный csv-файл с помощью django-import-export

#python #django #django-import-export

#python #ключевое слово-аргумент #django-import-export

Вопрос:

Я пытаюсь импортировать некоторые данные из csv-файла в базу данных django с помощью django-import-export с внешним ключом (местоположением). Чего я хочу добиться, так это того, что location_id передается URL-адресом запроса.

 value,datetime,location
4.46,2020-01-01,1
4.46,2020-01-02,1
  

Мои URL-адреса выглядят так, поэтому я хочу, чтобы «location_id» передавался в загруженный csv-файл:

 urlpatterns = [
...
...
    path('..../<int:location_id>/upload', views.simple_upload, name='upload'),
   ]
  

Мое представление выглядит так:

 def simple_upload(request, location_id):
    if request.method == 'POST':

        rainfall_resource = RainfallResource()
        dataset = Dataset()
        new_rainfall = request.FILES['myfile']


        imported_data = dataset.load(new_rainfall.read().decode("utf-8"), format="csv")


        try:
            result = rainfall_resource.import_data(dataset, dry_run=True)  # Test the data import
        except Exception as e:
            return HttpResponse(e, status=status.HTTP_400_BAD_REQUEST)

        if not result.has_errors():
            rainfall_resource.import_data(dataset, dry_run=False)  # Actually import now


       return render(request, '/import.html')
  

Мой ModelResource выглядит следующим образом:

 class RainfallResource(resources.ModelResource):

    location_id = fields.Field(
        column_name='location_id',
        attribute='location_id',
        widget=ForeignKeyWidget(Location, 'Location'))

    class Meta:
        model = Rainfall

    def before_import_row(self, row, **kwargs):
        row['location'] = location_id
  

Манипуляция работает, когда я жестко кодирую «location_id», например:

     def before_import_row(self, row, **kwargs):
        row['location'] = 123
  

Однако я не понимаю, как передать аргумент location_id из «url» в функцию «before_import_row». Помощь будет высоко оценена:-)

Ответ №1:

Я думаю, вам придется изменить свой imported_data в памяти перед импортом.

Вы можете использовать API tablib для обновления набора данных:

 # import the data as per your existing code
imported_data = dataset.load(new_rainfall.read().decode("utf-8"), format="csv")

# create an array containing the location_id
location_arr = [location_id] * len(imported_data)

# use the tablib API to add a new column, and insert the location array values
imported_data.append_col(location_arr, header="location")
  

Используя этот подход, вам не нужно переопределять before_import_row()

Комментарии:

1. Спасибо, Мэтью! Идеально!