Updating database based on previous csv file uploads - delete - create - or update Python/Dajngo

Viewed 37

Please need help with the following

I am trying to update database in comparison to previous uploaded csv file. I need to update all fields except the vin if it changes (vin is the unique value), delete the item if it is no longer in the csv file and create one if one is new

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

When I change any value and the csv is uploaded it makes a duplicate:

def upload_file__view(request): form = form(request.POST or None, request.FILES or None) company = 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)

        for i, row in enumerate(reader):
            if i==0:
                pass
            else:
                # row = "".join(row)
                # row = row.replace(",", " ")
                # row = row.split()
                print(row)
                print(type(row))
                vin = row[0].upper()
                condition = row[1].replace("U", "Used").replace("N", "New")
                stock_no = row[2]
                year = int(row[5])
                make = row[3]
                model = row[4]
                trim = row[6]
                mileage = row[8]
                mpg_city = row[18]
                mpg_hwy = row[19]
                engine = row[9]
                transmission = row[12]
                fuel_type = row[11]
                vehicle_type = row[7]
                drive_type = row[20].replace("4X2", "2WD").replace("4X4", "4WD")
                exterior_color = row[15]
                interior_color = row[16]
                price = row[13].replace("0", "")
                description = row[22]
                features_2 = row[21]
                images_data = row[23]
                raw_images_list = images_data.split(',')
                images_list = [""] * 25
                for x in range(image_count):
                    if x == 25:
                        break
                    images_list[x] = raw_images_list[x]
                    
                for x in images_list:
                    print(x)
                if images_list[0] == "":
                    images_list[0] = "https://www.beverlyhillscarclub.com/template/images/ina_f.jpg"
                car_photo =  images_list[0]
                car_photo_1 = images_list[1]
                car_photo_2 = images_list[2]
                car_photo_3 = images_list[3]
                car_photo_4 = images_list[4]
                car_photo_5 = images_list[5]
                car_photo_6 = images_list[6]
                car_photo_7 = images_list[7]
                car_photo_8 = images_list[8]
                car_photo_9 = images_list[9]
                car_photo_10 = images_list[10]
                car_photo_11 = images_list[11]
                car_photo_12 = images_list[12]
                car_photo_13 = images_list[13]
                car_photo_14 = images_list[14]
                car_photo_15 = images_list[15]
                car_photo_16 = images_list[16]
                car_photo_17 = images_list[17]
                car_photo_18 = images_list[18]
                car_photo_19 = images_list[19]
                car_photo_20 = images_list[20]
                car_photo_21 = images_list[21]
                car_photo_22 = images_list[22]
                car_photo_23 = images_list[23]
                car_photo_24 = images_list[24]
                # notes = pip._vendor.requests(images_list[0], stream=True)
                #car_photo = row[23]
        #         user = User.objects.get(username=row[3])
                Cars.objects.update_or_create(
                     vin = vin,
                     condition = condition,
                     stock_no = stock_no,
                     year = year,
                     make = make,
                     model = model,
                     trim = trim,
                     mileage = mileage,
                     mpg_city = mpg_city,
                     engine = engine,
                     transmission = transmission,
                     fuel_type = fuel_type,
                     vehicle_type = vehicle_type,
                     drive_type = drive_type,
                     exterior_color = exterior_color,
                     interior_color = interior_color,
                     price = price,
                     description = description,
                     company_name = company.company_name,
                     address = company.company_address,
                     city = company.city,
                     state = company.state,
                     zip = company.zip_code,
                     phone_number = company.phone_number,
                     email = company.fax_number,
                     features_2 = features_2,
                     car_photo = downloadFile(car_photo),
                     car_photo_1 = downloadFile(car_photo_1),
                     car_photo_2 = downloadFile(car_photo_2),
                     car_photo_3 = downloadFile(car_photo_3),
                     car_photo_4 = downloadFile(car_photo_4),
                     car_photo_5 = downloadFile(car_photo_5),
                     car_photo_6 = downloadFile(car_photo_6),
                     car_photo_7 = downloadFile(car_photo_7),
                     car_photo_8 = downloadFile(car_photo_8),
                     car_photo_9 = downloadFile(car_photo_9),
                     car_photo_10 = downloadFile(car_photo_10),
                     car_photo_11 = downloadFile(car_photo_11),
                     car_photo_12 = downloadFile(car_photo_12),
                     car_photo_13 = downloadFile(car_photo_13),
                     car_photo_14 = downloadFile(car_photo_14),
                     car_photo_15 = downloadFile(car_photo_15),
                     car_photo_16 = downloadFile(car_photo_16),
                     car_photo_17 = downloadFile(car_photo_17),
                     car_photo_18 = downloadFile(car_photo_18),
                     car_photo_19 = downloadFile(car_photo_19),
                     car_photo_20 = downloadFile(car_photo_20),
                     car_photo_21 = downloadFile(car_photo_21),
                     car_photo_22 = downloadFile(car_photo_22),
                     car_photo_23 = downloadFile(car_photo_23),
                     car_photo_24 = downloadFile(car_photo_24)                      
                     #car_photo = car_photo,
        #             quantity = int(row[2]),
        #             salesman = user
                 )
        
    obj.activated = True
        
    obj.save()

data = {
    'form' : form,
    'now' : now,
}
return render(request, 'uploads.html', data)

Thanks in advance for any help!

Thank you

2 Answers

Step 1

An empty list was created to compare with uploaded data:

imported_cars = []

Step 2

Created a filter of unique value (primary Key) and checked if it existed and used the method get to update items. Created car (item variable) to update or create ubject.

  if Cars.objects.filter(vin=vin).exists():
         car = Cars.objects.get(vin=vin)

Step 3

Used else statement to create item if it did not exist.

         else:
             car = Cars.objects.create(vin=vin, condition=condition...)

Last, out of the loop populated empty list with updated and created cars and deleted items that were in the database but not in the csv file.

    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()

Special thanks and credit to Zack Plauché who was extremely helpful and professional in helping me and teaching me how to solve this issue.

Your issue is in the model.py

you should write the Cars object with the following.

vin = models.CharField(primary_key=True, editable=False)

Confirm this works, since I am suggesting solution without actually seeing the model.py

This should handle the update aspect of your logic. The part where you delete a vin if its not in the CSV will have to be done with new process I don't see written here.But a suggestion would be to clear the DB and repopulate, or create function that compares DB with CSV and delete object if not in CSV.

Related