【发布时间】:2017-09-29 02:38:38
【问题描述】:
我正在 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优化这个sn-p代码的最佳方法是什么?
谢谢!
编辑:@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))
【问题讨论】:
-
read_bad_ips 是不同 IP 的列表,还是包含重复项?您可以通过消除重复项(如果它们存在并且不关心排序)来节省一些时间 (read_bad_ips = list(set(read_bad_ips))
-
@Johnny,
read_bad_ips仅具有唯一的 IP 地址。感谢您的反馈!
标签: python django sqlite django-1.10