Как проверить наличие или отсутствие данных в базе данных при загрузке большого набора данных с помощью 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_create
s 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
)
Ни одно из решений не является особенно элегантным, особенно если есть причины не иметь ограничение уникальности для любого из полей.