Как сохранить несколько значений в одной переменной или списке в django views.py? - PullRequest
0 голосов
/ 23 марта 2020

Вот мои views.py

@login_required
def appsc(request):

    allapplied = Applied_Scholarships.objects.filter(user_id = request.user.id)
    for applied in allapplied.iterator():
        print('hi')
        sch_id = applied.scholarship_id
        queryset = ScholarshipDetails.objects.filter(id = sch_id)
        print(queryset)
        context = {"object_list":queryset}

    return render(request,'applied-scholarships.html',context)

Здесь мне нужно проверить прикладные стипендии студента. Для этого я отфильтровал записи из таблицы Applied_Scholarship . После этого я взял scholarship_id и отфильтровал записи в таблице ScholarshipDetails , чтобы получить название и другие детали стипендии.

Теперь, как мне предотвратить object_list переопределить? Этот код дает мне только 1 стипендию вместо 2.

Вот мой шаблон:

            <table class="table mb-0">
                <tr>
                    <th>Scholarship name</th>
                    <th>End Date</th>
                    <th>Status</th>
                    <th></th>
                    <th></th>
                </tr>
                {% for instance in object_list %}
                    <tr>
                        <td>{{instance.name}}</td>
                        <td>{{instance.end_date}}</td>
                        <td>{{applied.status}}</td>
                        <td><a href = "government/home">{{schdets.link}}</a></td>
                    </tr>
                {% endfor %}
            </table>

Нужно ли мне использовать список? Если да, то как?

1 Ответ

1 голос
/ 23 марта 2020

Чтобы не перезаписывать переменную внутри for-l oop, вы делаете следующее:

list_ = []
for x in items:
    list_.append(x.something)
context = {'object_list': list_}

Но вместо циклического перебора по allaplied и получения id для ScholarshipDetails вы можете получить все сразу, например:

sch_ids = [x.scholarschip_id for x in allapplied.iterator()]
queryset = ScholarshipDetails.objects.filter(id__in=sch_ids)

Вам нужно меньше запросов к базе данных, и вы не перезаписываете свою переменную.

Более того: я полагаю, что ваши модели имеют OneToOne -отношение, поэтому вы можете использовать select_related для непосредственного получения ваших данных при получении Applied_Scholarships -инстанций. Тогда вы можете избавиться от второго filter и просто использовать соответствующее поле для моделей деталей, например, applied.details (точное название зависит от вашего дизайна модели).

...