Создавать новые объекты из списка, только если его нет в базе данных django
У меня есть список объектов python.
предположим py_objs_list = [...data...]
Модель является Card
Я хочу создать новый объект в базе данных django, только если в базе данных уже нет объекта
Мое решение состоит в том, чтобы сделать objects.all()
на моем Card
и запустить цикл for на py_objs_list
и проверить, есть ли py_obj
в objects.all()
.
Если нет, то я заношу py_obj
в отдельный список.
Наконец, создание объектов с помощью bulk_create
py_objs_list = [...data...]
cards = list(Card.objects.al()) <--- i know db hits here --->
emails = [card.email for card in cards] <--- does db hit here also everytime in a loop --->
empty_list = []
for py_obj in py_objs_list:
if py_obj[some_data] not in emails:
empty_list.append(py_obj)
---bulk_create---
Является ли это лучшим способом решения этой проблемы? Пожалуйста, скажите мне, если нет (хочу найти лучший вариант). спасибо:)
Теперь я сомневаюсь, попадает ли db каждый раз в list comprehension, как указано выше
Вы можете использовать bulk_create
и установить ignore_conflicts=True
https://docs.djangoproject.com/en/4.1/ref/models/querysets/#bulk-create
Это просто игнорирует все записи в списке объектов, которые не могут быть созданы, потому что они уже существуют.
Я думаю, что использование get_or_create() было бы лучше для вашего сценария.
Просто запустите цикл над вашим исходным списком и используйте столько полей, сколько хотите, чтобы убедиться, что найден уникальный экземпляр, например, так
py_obj_list = [...data...]
for py_obj in py_obj_list:
Card.objects.get_or_create(email=py_obj.email)