Обновление базы данных на основе предыдущих загрузок файлов 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()

Особая благодарность и признательность Заку Плауче, который был чрезвычайно полезен и профессионален, помогая мне и обучая меня, как решить эту проблему.

Вернуться на верх