Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 16, 2023 13:40:32

Vitek64
Зарегистрирован: 2022-10-19
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Flask и Chart.js

Помогите построить диаграмму!
Вводные даные:
Есть веб приложение на 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 (Сен. 18, 2023 14:42:03)

Прикреплённый файлы:
attachment Screenshot_20230916-124350_Chrome.jpg (124,3 KБ)

Офлайн

#2 Сен. 18, 2023 10:12:13

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2611
Репутация: +  62  -
Профиль   Отправить e-mail  

Flask и Chart.js

Оберни код в теги - нечитабельно



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Сен. 18, 2023 14:42:58

Vitek64
Зарегистрирован: 2022-10-19
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Flask и Chart.js

ZerG
Оберни код в теги - нечитабельно
Прошу прощения, уже исправил)

Офлайн

#4 Сен. 19, 2023 07:13:44

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2611
Репутация: +  62  -
Профиль   Отправить e-mail  

Flask и Chart.js

покажите что выводит принтом amount_titles
что бы понять структуру которуб вам возвращает
Но вобще во всех примерах идет что-то типа

 import Chart from 'chart.js/auto'
(async function() {
  const data = [
    { year: 2010, count: 10 },
    { year: 2011, count: 20 },
    { year: 2012, count: 15 },
    { year: 2013, count: 25 },
    { year: 2014, count: 22 },
    { year: 2015, count: 30 },
    { year: 2016, count: 28 },
  ];
  new Chart(
    document.getElementById('acquisitions'),
    {
      type: 'bar',
      data: {
        labels: data.map(row => row.year),
        datasets: [
          {
            label: 'Acquisitions by year',
            data: data.map(row => row.count)
          }
        ]
      }
    }
  );
})();
то есть в вашем случае надо будет что-то типа

 data: amount_titles.map(amount_titles.XXX)



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#5 Сен. 23, 2023 00:02:38

Vitek64
Зарегистрирован: 2022-10-19
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Flask и Chart.js

ZerG
покажите что выводит принтом amount_titlesчто бы понять структуру которуб вам возвращаетНо вобще во всех примерах идет что-то типа
Мне по ходу надо глубже изучить JS, чтобы понять что вы написали..).
Но идея, как мне кажется, близкая к моему случаю.
А вместо иксов что здесь должно быть?
    data: amount_titles.map(amount_titles.XXX) 

Офлайн

#6 Сен. 24, 2023 20:00:20

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2611
Репутация: +  62  -
Профиль   Отправить e-mail  

Flask и Chart.js

Имя ключа по которому итерироваться - внимательно посмотрите на структуру данных в примере и что в этом месте вместо иксов



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version