Создавать новые объекты из списка, только если его нет в базе данных 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)

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