【问题标题】:Save list of records and fields into django model将记录和字段列表保存到 django 模型中
【发布时间】:2019-05-26 01:52:33
【问题描述】:

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

[['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:]

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

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案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)
    

    【讨论】:

    • 如果此列表中存在两个引用一个用户的项目,例如:[['present','2'],['study','2'],...],我必须做什么? @benito-h
    • 更新后的代码对您有用吗?现在您可以同时设置学生和当前真实
    • 是的。是否可以使用bulk_create 方法更新您的答案以一次性访问数据库? @benito-h
    • 试试Rollcall.objects.bulk_create([Rollcall(present=True if 'present' in dic[s_id] else False, study=True if 'study' in dic[s_id], student=User.objects.get(id=int(s_id)) for s_id in dic)])
    • 非常感谢。我将使用正确的变量编辑您的问题并接受它。请代表我@benito-h
    【解决方案2】:

    您可以迭代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)
    ])
    

    希望对你有帮助。

    【讨论】:

    • 我无法理解您的回答。解释一下。还要注意两个注意事项:每个用户在这个列表中可以有两个项目(用户可以是persent或不是study或不是study(4个状态))。如果用户同时拥有这两个字段,我们必须将两个字段都更改为True。您的回答是否考虑到此通知?如何 ? @gachdavit
    • 您向我们提供了列表。 [['present', '2'], ['present', '3'], ['present', '4'], ['study', '1']][['present', '2'], ['present', '3'], ['present', '4'], ['study', '1']][[present, user_id], [present, user_id]]。你在 4 州是什么意思?
    • 这是状态 1:[['present', '1'], ['study', '1'],...]。这是状态 2:[ ['study', '1'],...]。这是状态 3:[['present', '1'],...],当用户没有任何 presentstudy.@gachdavit 时,会出现状态四
    • 你有什么问题我不明白?遍历您的列表并进行条件分支并在数据库中插入数据。什么是阻塞因子?
    • 是否可以在我的问题中编辑和解释更多内容?我想我必须写我的forms.py 文件并告诉你更多关于问题的信息。 @gachdavit
    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 2011-06-11
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多