创建新的对象从列表只有当它不在django数据库

tag5nh1u  于 2022-12-14  发布在  Go
关注(0)|答案(2)|浏览(93)

我有一个python对象列表。
假设py_objs_list = [...data...]型号为Card
我只想在django数据库中创建一个新对象,如果数据库已经没有对象的话
我的解决方案是在Card上执行objects.all(),在py_objs_list上运行for循环,检查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---

这是解决这个问题的最好方法吗?如果不是,请告诉我(想要最好的)。thnks:)
现在我的疑问是db是否如上所述每次都在列表理解中命中
my solution for this problem

qyswt5oh

qyswt5oh1#

您可以使用bulk_create并设置ignore_conflicts=True
https://docs.djangoproject.com/en/4.1/ref/models/querysets/#bulk-create
这将忽略对象列表中的任何记录,因为这些记录已经存在而无法创建。

yfjy0ee7

yfjy0ee72#

我认为使用get_or_create()更适合您的场景。
只需在原始列表上运行一个循环,并根据需要使用任意多个字段,以确保找到唯一的示例,如下所示

py_obj_list = [...data...]

for py_obj in py_obj_list:
        Card.objects.get_or_create(email=py_obj.email)

相关问题