将记录和字段列表保存到 Django 模型中

Save list of records and fields into django model

我从我的网站管理员那里收到此列表:

[['present', '2'],['present', '1'], ['study', '1'], ['study', '3'], ['present', '4'], ['study', '4'], 

第一个选项实际上是在Rollcall模型中需要编辑的字段名称,第二个选项是用户ID。

现在我想将此列表保存到 Rollcall 模型:

#models.py 
class Rollcall(models.Model):
    student = models.ForeignKey(User)
    present = models.BooleanField(default=False)
    study = models.BooleanField(default=False)

所以我首先检查并找到特定用户在列表中的各个字段, 然后我将在我的模型中为一个用户保存所有这些字段。 我该怎么做?

--更新一: 这是 HTML 文件:

{% forstudent in students %}
                            <tr>
                                <td>{{student}} </td>
                                <td> <input type="radio" name="present_{{student.id}}" value="1"></td>
                                <td> <input type="radio" name="study_{{student.id}}" value="1"></td>
                            </tr>
                        {% endfor %}

我以这种方式获取数据并将它们放入我在这个问题的第一个中解释的列表中:

data_list = [key.split('_') for key in request.POST.keys()][1:]

每个学生可以在场或缺席或可以学习或not.my确切的问题是:如何保存我所有学生的数据?有没有另一种方法可以解决这个问题没有data_list 或任何其他创造更好的方式 data_list?

尝试这样的事情:

l=[['present', '2'], ['present', '3'], ['present', '4'], ['study', '2']]
dic={}
for arr in l:
    dic.setdefault(arr[1], []).append(arr[0])
for key in dic:
    Rollcall.objects.create(present=True if 'present' in dic[key] else False,\
    student=True if 'student' in dic[key] else False, \
    study=User.objects.get(id=int(key)))

或者创建字典后批量制作(dic):

final_objects = [Rollcall(is_present=True if 'present' in final_dic[key] else False,
                          is_study=True if 'study' in final_dic[key] else False,
                          student=User.objects.get(id=int(key)),
                          ) for key in final_dic]
Rollcall.objects.bulk_create(final_objects)

您可以迭代 list,创建 Rollcall 实例并使用 bulk_create() Manager/QuerySet 方法(这避免了很多数据库命中(只有一个 INSERT 查询就足够了)并保证 atomicity).

data_list = [['present', '2'], ['present', '3'], ['present', '4'], ['study', '1']]

Rollcall.objects.bulk_create([
    Rollcall(present=True if present == 'present' else False, student_id=int(student_id)) for present, student_id in data_list)
])

希望对你有帮助。