避免在Django中重复查询

时间:2018-06-26 06:41:21

标签: python django loops

我正在使用我的应用程序中的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文件中的列表包含许多重复的名称。因此,我可以有1000条记录,只有10个不同的名称。但是在当前情况下,将有1000个查询到数据库。我正在尝试执行的操作(但我不确定如何执行)是以某种方式检查名称是否已经查找,如果已查找,则应使用先前的查询结果而不是执行新的查询。

澄清

在用户表中,我有爱丽丝,鲍勃,玛塔

在我的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文件很大,并且有很多重复的名称,这使情况更加复杂)。

2 个答案:

答案 0 :(得分:1)

您可以使用numpy执行以下操作

使用numpy加载csv文件

<input class="form-control" type="text" name="studentid" id="studentid"  autocomplete="off"  required value="<?php echo strtoupper($_POST['studentid']); ?>" />

询问numpy,从数据列中返回唯一的data = np.loadtxt(path)

names

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)

答案 1 :(得分:1)

data = []
with open(path) as f:
    reader = csv.reader(f)
    for row in reader:
        ...
        data.append({'name': row[0], 'age': row[1], 'phone': row[2], 'user': user})

将整个CSV加载到Python列表中时,应尝试将list转换为set;一组仅包含唯一值。您随时可以转换回列表。

data_set = set(data)
unique_data_list = list(data_set)

在模板中,

{% for info in unique_data_list %}
  <td>{{ info.name }}</td>
  <td>{% if info.user %}} {{ info.user.name }} {% else %} No user {% endif %}</td>
{% endfor %}