Как проверить наличие или отсутствие данных в базе данных при загрузке большого набора данных с помощью django

Я собираюсь сделать скрипт, который загружает excelsheet, содержащий 17000 строк, в модель django. Но я не могу понять, как эффективно проверить, существуют ли уже данные в базе данных или нет.

in models.py

# no fields value are unquie here,

class Student(models.Model):
    name=models.CharField(max_length=100)
    address=models.CharField(max_length=100)
    age=models.CharField(max_length=100)
    rollno=models.CharField(max_length=100)

in views.py
def upload_script(request):
    wb = openpyxl.load_workbook(excel_file)
    worksheet = wb["All DMAs"]
    
    for row in worksheet.iter_rows():
        datacollection=row[0:9]
        name=datacollection[0]
        address=datacollection[1]
        rollno=datacollection[2]
        age=datacollection[3]
   
      # everytime this call the database which load more time
       if(Student.objects.filter(name=name,address=address,rollno=rollno,age=age).first():
          continue

       student_obj=Student(
             name=name,
             address=address,
             rollno=rollno,
             age=age
          )
      student_list.append(student_obj)
      if len(student_list)>1000:
         Student.objects.bulk_create(student_list)
         student_list=[]
    Student.objects.bulk_create(student_list)

         

В зависимости от бэкенда бд, одним из методов может быть подтверждение ограничения уникальности на соответствующие поля в модели и использование параметра bulk_creates ignore_conflicts (см. QuerySet API reference).

Кроме того, обратите внимание на параметр batch_size, который может удалить

if len(student_list)>1000:
    Student.objects.bulk_create(student_list)
    student_list=[]

из вашего кода.

Student.objects.bulk_create(student_list,batch_size=1000,ignore_conflicts=True)

Другим потенциальным решением, но с одним ударом db на объект (хотя вы уже это делаете), было бы использование get_or_create вместо filter.

student_obj=Student.objects.get_or_create(
    name=name,
    address=address,
    rollno=rollno,
    age=age
)

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

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