Решено - django for-loop отображает только последнюю итерацию
Я создаю Django-приложение для рекомендации книг. Я уже интегрировал свою модель машинного обучения, но проблема в том, что она получает данные из csv-файла, который я использовал, а не из моей базы данных. У меня нет проблем с отображением названий рекомендуемых книг, но я хотел бы позволить пользователям просматривать страницу с подробной информацией о книге. Исходя из этого, мне нужно получить id рекомендуемых книг из моей Book
модели.
Я относительно новичок в Django, поэтому прошу прощения, если мои коды будут неаккуратными.
Это отрывок из моего views.py
:
def s_detail(request, book_id): #student paper detail
cosine_sim = joblib.load('cosine_sim-v5.pkl') #load the ml model
data = pd.read_csv('try.csv', sep=',', encoding='utf-8')
try:
book = Book.objects.get(pk=book_id)
fav = True
if book.favorites.filter(id=request.user.id).exists():
fav=False
def recommendations(book_id,n, cosine_sim = cosine_sim):
recommended_books = []
idx = book_id
score_series = pd.Series(cosine_sim[idx]).sort_values(ascending = False)
top_n_indexes = list(score_series.iloc[1:n+1].index)
for i in top_n_indexes:
recommended_books.append(list(data.index)[i]) # data.index for book_id column
return recommended_books
recommend = recommendations(book_id, 3)
for i in recommend:
new = Book.objects.filter(id=i) #to get the Book id from the model
print(new) #just to check if it's working
except Book.DoesNotExist:
raise Http404("Title does not exist")
return render (request, 'books/s_detail.html', {'book':book, 'fav':fav, 'recommend':recommend, 'new':new})
в моем шаблоне:
{% for book in new %}
<div class="card">
<img src="/books/media/{{book.book_image}}" alt="bookimage"><br>
<div class="browse-content">
<b>Title:</b> <a href="{% url 's_detail' book.id %}"> {{book.book_title}} </a><br>
<div class="eye">
<i class="fa-solid fa-eye"></i> Views
</div>
</div>
</div>
{% endfor %}
итерация работает нормально, судя по распечатанному выводу в терминале
[22/Dec/2022 10:27:42] "GET /books/s_browse HTTP/1.1" 200 27157
<QuerySet [<Book: Radioprotective Potential of Leaf Extract of Sapinit (Rubus rosifolius) On the Sperm Count and Sperm Morphology of y-Irradiated Mice (Mus musculus)>]>
<QuerySet [<Book: Analysis of Cytotoxic Activities of Select Plant Extracts against A549 - Lung Adenocarcinoma Cell Line>]>
<QuerySet [<Book: Inventory of Epiphytes on the Walls of Intramuros, Manila>]>
но отображает только последнюю итерацию в шаблоне
Я чувствую, что мне нужно где-то хранить значения, но не знаю как.
Вы перезаписываете переменную new
новой QuerySet
размером 1 в цикле for
. Попробуйте заменить следующее:
recommend = recommendations(book_id, 3)
for i in recommend:
new = Book.objects.filter(id=i) #to get the Book id from the model
print(new) #just to check if it's working
с этим:
recommend = recommendations(book_id, 3)
new = Book.objects.filter(id__in=recommend)
print(new)
Выбираются все экземпляры Book
со значением id
, которые существуют в списке recommend
.