首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Django优化列表中的每个元素与数据库中的每个元素

使用Django优化列表中的每个元素与数据库中的每个元素
EN

Stack Overflow用户
提问于 2017-05-01 17:09:26
回答 1查看 60关注 0票数 0

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

我的数据库由一个Host表和一个名为ipv4_address的字段组成。

下面是相关的model.py:

代码语言:javascript
复制
class Host(models.Model):
    ipv4_address = models.GenericIPAddressField(protocol='ipv4', default='0.0.0.0', unique=True)

下面是相关的views.py:

代码语言:javascript
复制
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))

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-01 17:13:55

你可以这样做:

代码语言:javascript
复制
bad_ips = Host.objects.filter(ipv4_address__in=read_bad_ips).values_list('ipv4_address', flat=True)

这将为您提供一个位于ipv4_address列表中的read_bad_ips值的列表(可能是emtpy,可能不是)。

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

代码语言:javascript
复制
for addr in Host.objects.values_list('ipv4_address', flat=True).iterator():
    if addr in read_bad_ips:
        bad_ips.append(addr)

编辑2:尝试使用setintersection方法,如下所示:

代码语言:javascript
复制
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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43723198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档