我正在我的应用程序中使用 CSV 数据。 CSV 文件中的一列包含一个名称。对于每一行,我需要检查该名称是否已注册。如果是,我将存储一个变量并稍后使用它:
data = []
with open(path) as f:
reader = csv.reader(f)
for row in reader:
user = False
check_user = User.objects.filter(name=row[0])
if check_user:
user = check_user[0] # This will only return a single row so I want that one to be stored in the user variable instead of a list
data.append({'name': row[0], 'age': row[1], 'phone': row[2], 'user': user})
然后在我看来我会做类似的事情:
{% for info in data %}
<td>{{ data.name }}</td>
<td>{% if data.user %}} {{ data.user.name }} {% else %} No user {% endif %}</td>
{% endfor %}
问题
这一切都运作良好。但是,问题是 CSV 文件中的列表包含许多重复的名称。所以我可以有 1,000 条记录,其中只有 10 个不同的名称。但在当前场景中,将对数据库进行 1,000 次查询。我想要做的,但我不知道如何做,是以某种方式检查名称是否已经被查找过,如果是,则应该使用以前的查询结果而不是进行新的查询。
澄清
在我的用户表中,我有 alice、bob、marta
在我的 CSV 文件中,我有如下记录:
name,age,phone
marta,30,12345
marta,30,12345
marta,30,12345
marta,30,12345
bob,22,33555
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
在上面的例子中,我只有三个唯一的名称,所以我只想对数据库进行 3 个不同的查询。在我当前的设置中,每一行都会导致一个查询,这会浪费资源(而且 CSV 文件非常大,有很多重复的名称,这一事实使情况更加复杂)。
最佳答案
您可以使用 numpy 执行以下操作
使用 numpy 加载 csv 文件
data = np.loadtxt(path)
要求 numpy 从数据列中返回唯一的名称
names_column = data[:,0] # if the names are in 0th column
unique_names = np.unique(names_column,return_index=True)
return_index
将为您提供列中唯一名称的索引,您可以使用它进行进一步处理。
编辑
特别是对于您粘贴的示例输入,您可以执行以下操作
data = np.genfromtxt('in_data',dtype=None,names=True,delimiter=',')
print np.unique(data['name'],return_index=True)
输出将如下所示:
(array(['alice', 'bob', 'marta'], dtype='|S5'), array([5, 4, 0]))
关于python - 避免 Django 中的重复查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51036397/