我有很多数据,这些数据很脏,例如:
表 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"
- Import Datas already exist 3 2018-07-16 00:00:00 0 在 objs 中两次,所以当我批量创建时它会引发重复,然后它会回滚所有提交! !!
“1”,我可以用get或者create来解决 但是“2”,我现在无法检查我附加的数据是否存在于 objs 中 我试图用它来检查是否存在,但是当数据行超过 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
有没有更好的办法?谢谢。
最佳答案
您可以添加一个包含id
、time
和number
的元组到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 批量创建检查已经存在于批量对象和实例中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51358190/