我有很多数据,这些数据很脏,例如:
表格ORM:

id = models.CharField(default='', max_length=50)
time = models.DateTimeField(default=timezone.now)
number = models.CharField(default='', max_length=20)
value = models.CharField(default='', max_length=20)

unique_together = ['id', 'time', 'number']

表数据:
id   time                   number   value
 1     2018-07-16 00:00:00   1         64
 1     2018-07-16 00:00:00   2         -99
 1     2018-07-16 00:00:00   3         655
 1     2018-07-16 00:00:00   4         3
 2     2018-07-16 00:00:00   0         12

导入数据(示例):
id   time                   number   value
 1     2018-07-16 00:00:00   1         64
 3     2018-07-16 00:00:00   0         -99
 3     2018-07-16 00:00:00   0         11
 4     2018-07-16 00:00:00   0         -99
 4     2018-07-16 00:00:00   1         -99

所以,当我这样做的时候
for loop....
    objs = []
    objs.append(A(**kwargs))
A.objects.bulk_create(objs, batch_size=50000)

它将产生两种复制品。
表已经存在“1 2018-07:16:00 00 00 1”
导入数据已经存在3次2018—07~1600∶00,0次在Objs中两次,所以当我批量创建时,它将重复,然后它将回滚所有提交!!!
“1”,我可以使用get或create来解决它
但是“2”,我现在不能检查我在Objor中附加数据
我试着用这个来检查是否存在,但是当数据行超过1000000时,
复杂性将是可怕的。
def search(id, time, number, objs):
    for obj in objs:
        if obj['id'] == id and obj['time'] == time and obj['number'] == number:
            return True
    return False

有更好的办法吗?谢谢。

最佳答案

可以将具有idtimenumber的元组添加到set

objs = []
duplicate_check = set()
for loop....
    data = kwargs['id'], kwargs['time'], kwargs['number']
    if not data in duplicate_check:
        objs.append(A(**kwargs))
        duplicate_check.add(data)
A.objects.bulk_create(objs, batch_size=50000)

set操作具有O(1)的复杂性。

关于django - Django批量创建如何检查在批量objs和实例中已经存在?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51358190/

10-16 16:24