Сохранить список записей и полей в модель Django - PullRequest
1 голос
/ 26 мая 2019

Я получаю этот список от администратора моего веб-сайта:

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

Первый параметр - это имя поля, которое необходимо изменить в модели Rollcall, а второй - идентификатор пользователя.

Теперь я хочу сохранить этот список в 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 ]

1 голос
/ 26 мая 2019

Вы можете перебрать 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)
])

Надеюсь, это поможет вам.

1 голос
/ 26 мая 2019

Попробуйте что-то вроде этого:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...