Django交叉的非提交模型对象和提交的模型对象

时间:2017-12-29 00:53:43

标签: python django

我所拥有的是我尚未运行objs的模型对象列表:

Model.objects.all()

我想要做的是将field[Model(id=3, field=foo)] 相交,并仅返回数据库中已有的对象(基于objs值)。

例如,如果我的数据库是:

objs = [Model(id=1, field=bar)]

然后生成的--append应为:

Model

这样的事情可能吗?

编辑:

进一步解释:

我正在做的是我有一个导入命令,我试图包含bulk_create标记。

没有旗帜,我会删除表格,然后重新开始。

使用旗帜,我想批量创建大量对象(单个创建速度慢得多 - 我已经检查过),我不想让对象具有相同的字段值但是不同IDS。

我已经尝试在插入后过滤掉重复项,但它很慢并且我想测试这种方法以确定它是否更快。

从CSV文件中读取对象,制作create,然后kubectl create serviceaccount ACCOUNT_NAME的列表的速度更快,而不是在每行上运行order.id customer.id Apples Peaches Pears 1001 J Car Ltd 1 0 0 1002 Som Comp 1 2 0 1005 Richardson 0 0 1 1004 J Car Ltd 1 0 0 1003 J Car Ltd 2 0 0 1006 Richardson 1 0 1 1007 Aldridge 0 0 1 1008 J Car Ltd 0 0 1 1010 Som Comp 0 1 0

1 个答案:

答案 0 :(得分:1)

我们最好通过首先构建数据库中field列的一组值来实现此目的:

field_vals = set(Model.objects.values_list('field', flat=True).distinct())

然后我们可以执行过滤,如:

filtered_objs = [obj for obj in objs if obj.field not in field_vals]

首先构建set,我们运行单个查询,在 O(n)中构建set n 数字数据库中的Model s,然后在 O(m)中过滤( m objs中的对象数)。所以算法是 O(m + n)

然而,基于这个问题,看起来你可能首先可以节省构建这些对象的工作量。您可以使用Django的get_or_create函数。并使用它:

obj, created = Model.objects.get_or_create(field=foo)

obj反对(从数据库中提取,或在数据库中创建),created bool ean是True,如果我们不得不创建一个新对象。

相关问题