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

时间:2019-05-26 01:52:34

标签: python django django-models django-orm django-2.2

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

[['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)

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

-更新1: 这是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:]

每个学生都可以在场或不在场,或者可以学习或不学习。我的确切问题是:如何保存我所有学生的数据?有没有其他方法可以解决这个问题而无需data_list或其他任何方法创造更好的data_list的方法吗?

2 个答案:

答案 0 :(得分:1)

尝试这样的事情:

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)

答案 1 :(得分:1)

您可以遍历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)
])

希望,对您有帮助。