Обновление базы данных на основе предыдущих загрузок файлов csv - удаление - создание - или обновление Python/Dajngo
Пожалуйста, нужна помощь в следующем
Я пытаюсь обновить базу данных по сравнению с предыдущим загруженным csv-файлом. Мне нужно обновить все поля, кроме vin, если он изменился (vin - уникальное значение), удалить элемент, если его больше нет в csv-файле, и создать его, если он новый
vin. stock_no make model trim miles
12345789098765432 4535 honda civic lx 89000
j4j4jj49098765432 3453 toyota corolla DX 54555
12345345438765432 6254 ford mustang es 101299
Когда я изменяю любое значение и загружаю csv, он делает дубликат:
def upload_file__view(request): form = form(request.POST or None, request.FILES or None) компания = Comp_info.objects.last() if form.is_valid(): form.save() obj = c.objects.get(activated=False) with open(obj.file_name.path, 'r+') as f: reader = c.reader(f)
Заранее спасибо за любую помощь!
Спасибо
Ваша проблема находится в model.py
вы должны записать объект Cars следующим образом.
vin = models.CharField(primary_key=True, editable=False)
Убедитесь, что это работает, поскольку я предлагаю решение, фактически не видя model.py
Это должно обрабатывать аспект обновления вашей логики. Часть, где вы удаляете vin, если его нет в CSV, должна быть сделана с помощью нового процесса, который я не вижу написанным здесь. Но предложение было бы очистить БД и заново заполнить, или создать функцию, которая сравнивает БД с CSV и удаляет объект, если его нет в CSV.
Шаг 1
Был создан пустой список для сравнения с загруженными данными:
imported_cars = []
Шаг 2
Создал фильтр уникального значения (первичный ключ), проверил, существует ли он, и использовал метод get для обновления элементов. Создал машину (переменная элемента) для обновления или создания объекта.
if Cars.objects.filter(vin=vin).exists():
car = Cars.objects.get(vin=vin)
Шаг 3
Используется оператор else для создания элемента, если он не существует.
else:
car = Cars.objects.create(vin=vin, condition=condition...)
Последним, вне цикла, заполняется пустой список с обновленными и созданными автомобилями и удаленными элементами, которые были в базе данных, но не в csv-файле.
imported_cars_vin_numbers = [car.vin for car in imported_cars]
for car in Cars.objects.all():
if car.vin not in imported_cars_vin_numbers:
car.delete()
Особая благодарность и признательность Заку Плауче, который был чрезвычайно полезен и профессионален, помогая мне и обучая меня, как решить эту проблему.