Найти - Пользователи
Полная версия: Flask и Chart.js
Начало » Python для новичков » Flask и Chart.js
1
Vitek64
Помогите построить диаграмму!
Вводные даные:
Есть веб приложение на Flask с БД в которой есть таблица из трех колонок:
class Pnh(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
date = db.Column(db.DateTime, default=datetime.utcnow)
В каждом месяца года записывались статьи в базу данных.
И есть вот такая диаграмма из Chart.js:
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
datasets: [{
label: '# of Votes',
data: amount_chart ,
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
Диаграмма показывает колонки, 12 штук, 12 месяцев. Я хочу чтобы колонки показывали количество статей за каждый месяц в году. Как из БД вытянуть количество статей в каждом месяце? Путем долгих поисков мне удалось найти вот такой решение, использовать extract.
 @app.route('/chart')
def chart():
amount_titles = db.session.query(db.func.count(Pnh.title).filter(extract('year', Pnh.date) == 2023).filter(extract('month', Pnh.date) == 1)).all()
amount_chart = []
for x, in amount_titles:
amount_chart.append(x)
return render_template('chart.html', amount = json.dumps(amount_chart))
Но этот решение даёт мне мне только один месяц какой-то в году, благодаря этой строчке:
amount_titles = db.session.query(db.func.count(Pnh.title).filter(extract('year', Pnh.date) == 2023).filter(extract('month', Pnh.date) == 1)).all() 
Так я получаю только один столбец в диаграмме.
Как сделать так, чтобы из базы данных вывести количество статей, записанных в каждом месяце и чтобы это в диаграмму вывести. Только написать 12 раз тот же код, меняя только месяц и получится куча кода и как-то грязно или есть какой-то другой выход?
Код из HTML на страницу с диаграммой:
{% extends 'base.html' %}

{% block title %}
График
{% endblock %}

{% block body %}
<div class="container">
<canvas id="myChart"></canvas>
</div>

<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>

<script>
let amount_chart = JSON.parse({{ amount | tojson }});
const ctx = document.getElementById('myChart');

new Chart(ctx, {
type: 'bar',
data: {
labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
datasets: [{
label: '# of Votes',
data: amount_chart ,
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>

{% endblock %}


Vitek64
Vitek64
Помогите построить диаграмму!Вводные даные: Есть веб приложение на Flask с БД в которой есть таблица из трех колонок:
Диаграмма вот такая. Мне удалось получить только один месяц:
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB