优化使用Django将列表的每个元素与数据库中的每个元素进行比较

时间:2017-05-01 17:09:26

标签: python django sqlite django-1.10

我正在 Django 1.10 中开展项目,我的一个应用程序要求我导入500-100,000个IP地址列表,然后将这些500-100,000个IP地址进行比较存储在 SQLite3 数据库中的~25,000 + IP地址。不幸的是,这需要相当长的时间,这是我非常需要减少的。

我的数据库包含一个Host表,其中包含一个名为ipv4_address的字段。

这里是相关的model.py:

class Host(models.Model):
    ipv4_address = models.GenericIPAddressField(protocol='ipv4', default='0.0.0.0', unique=True)

这里是相关的views.py:

bad_ips = []
read_bad_ips = [ '500', 'to', '100000', 'ips', 'here', '...' ]

for ip in read_bad_ips:
    if Host.objects.filter(ipv4_address=ip).exists():
        bad_ips.append(Host.objects.get(ipv4_address=ip))

其中read_bad_ips是IP地址列表,bad_ips是我希望存在于数据库 read_bad_ips列表中的IP列表

从views.py优化此代码段的最佳方法是什么?

谢谢!

编辑: @ nik_m的解决方案解决了这场危机!

  

read_bad_ips = [ '500', 'to', '100000', 'ips', 'here', '...' ]

     

addresses = Host.objects.values_list('ipv4_address', flat=True)

     

bad_ips = list(set(read_bad_ips).intersection(addresses))

1 个答案:

答案 0 :(得分:0)

你可以这样做:

bad_ips = Host.objects.filter(ipv4_address__in=read_bad_ips).values_list('ipv4_address', flat=True)

它将为您提供ipv4_address列表中read_bad_ips值的列表(可能是emtpy,可能不是)。

[编辑]: 由于您使用的是sqlite数据库,并且此数据库有其局限性(由于您拥有大量值),您可以尝试这样做:

for addr in Host.objects.values_list('ipv4_address', flat=True).iterator():
    if addr in read_bad_ips:
        bad_ips.append(addr)

[编辑2]: 尝试使用set的{​​{3}}方法,如下所示:

read_bad_ips = [ '500', 'to', '100000', 'ips', 'here', '...' ]
addresses = Host.objects.values_list('ipv4_address', flat=True)

bad_ips = list(set(read_bad_ips).intersection(addresses))