Как отобразить модели django с полем datetime на графике с помощью chartjs
Привет всем я застрял на проблеме, у меня есть модель django, которая называется ScanBatch, теперь этот Scan batch состоит из таких полей как метка времени (поле datetime), домен (поле char) и общее количество найденных id (целочисленное поле)
Мой код графика:
const ctx = document.getElementById('myChart').getContext('2d');
const myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: [],
datasets: []
},
options: {
scales: {
yAxes: [{
id: 'A',
type: 'linear',
position: 'left',
}, {
id: 'B',
type: 'linear',
position: 'right',
ticks: {
max: 1,
min: 0
}
}]
}
}
});
код модели является
class ScanBatch(models.Model):
domain = models.CharField(max_length=255)
timestamp = models.DateTimeField(auto_now_add=True)
valid_ids_found = models.IntegerField(default=0)
вопрос с подвохом в том, как мне сделать так, чтобы график показывал пакетные данные исторически из django, а затем выводил их на график
Я хочу показывать партии исторически по дате, а также группировать по домену
Примером того, какие данные нужно построить, являются : www.someexample.com | 2022-09-03 | 34
www.someexample.com | 2022-09-04 | 55
Сначала нужно получить значения и правильно просуммировать все ID. (Для каждого дня). Чтобы сделать это, вы можете получить их из:
Добавлен домен
Пуск редактирования
chartdata = ScanBatch.objects.all().values('timestamp__date').annotate(models.Sum('valid_ids_found'),domain=models.F('domain'))
Затем передайте это в шаблон.
В шаблоне, чтобы подготовить данные, нужно выполнить итерацию по ним в javascript. Например, так:
const chartData = {{ chart_data |safe }};
let arr = [];
let arrlabels = [];
let domainlabels = [];
for (let value of Object.values(chartData)) {
arr.push(value.valid_ids_found__sum);
arrlabels.push(value.timestamp__date);
domainlabels.push(value.domain)
}
console.log(chartData)
Конец редактирования
Теперь у вас есть подготовленные данные, готовые к использованию на графике.
const chartData = {{ chart_data |safe }};
let arr = []
let arrlabels = []
for (let value of Object.values(chartData)) {
arr.push(value.valid_ids_found__sum);
arrlabels.push(value.timestamp__date);
}
const ctx = document.getElementById('myChart').getContext('2d');
const myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: arrlabels ,
datasets: arr
},
options: {
scales: {
yAxes: [{
id: 'A',
type: 'linear',
position: 'left',
}, {
id: 'B',
type: 'linear',
position: 'right',
ticks: {
max: 1,
min: 0
}
}]
}
}
});
Это первая часть, по крайней мере, у меня нет достаточных знаний о Chart.js, чтобы различать и домен. Извини, дружище. Хотя это может помочь тебе!