1

我想知道是否可以对下面粘贴的代码获得一些帮助。现在它运行并完成了 ping 任务,但是它遇到了以下错误。任何帮助都会很棒,因为我已经为此工作了一段时间。

错误:

    Server.objects.filter(pk=id[0]).update(online=1)
TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'

代码:

import subprocess
from django.db import models
from networkstats.models import Server

query = Server.objects.values_list('id', 'ip_address')
for ip_address in query:
    print 'Server ID: ' + str(ip_address[0])
    print 'Server IP: ' + str(ip_address[1])
    command = ['ping -t 200 -c 1 ' + ip_address[1]]
    ping = subprocess.Popen(command, stdout=subprocess.PIPE, shell = True)
    if "100% pocket loss" in ping.stdout.read():
        Server.objects.filter(pk=id[0]).update(online=0)
    else:
        Server.objects.filter(pk=id[0]).update(online=1)
4

2 回答 2

1

看起来像一个错字。你想写ip_address[0]而不是id[0]

id是一个内置函数,因此您会收到此错误。

还要看看你的代码片段可能更好的实现:

for server in Server.objects.only('ip_address', 'id').all():
    print 'Server ID: ' + str(server.id)
    print 'Server IP: ' + str(server.ip_address)

    command = ['ping -t 200 -c 1 ' + server.ip_address]
    ping = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)

    online = 1
    if "100% pocket loss" in ping.stdout.read():
        online = 0

    server.update(online=online)

这将只获取需要的行(如果还有其他行)并减少到数据库的流量。

于 2012-10-09T08:39:16.553 回答
0

不是你要找的吗ip_address[0]id[0]

于 2012-10-09T09:03:18.130 回答