Как фильтровать и добавлять несколько наборов данных с помощью Django и Chart.js
Я долго ломал голову над этим вопросом, поэтому любая помощь будет очень признательна.
Допустим, у меня есть модель под названием Transaction.
class Transaction(models.Model):
time = models.DateTimeField(auto_now_add=True, blank=True)
client = models.ForeignKey(User , on_delete=models.Cascade)
value = models.IntegerField()
Я хочу сгенерировать график с помощью chart.js. Пока что я могу сделать это для всех объектов, используя этот JS:
<script>
$(function () {
var $xChart = $("#xChart");
$.ajax({
url: $xChart.data("url"),
success: function (data) {
var ctx = $xChart[0].getContext("2d");
new Chart(ctx, {
type: 'line',
data: data,
options: {
responsive: true,
legend: {
position: 'top',
},
title: {
display: true,
text: 'xChart'
}
}
});
}
});
});
</script>
И этот FBV для вызова ajax:
def x_chart(request):
def random_color():
return "#"+''.join([choice('ABCDEF0123456789') for i in range(6)])
labels=[]
data=[]
enddate = datetime.now()
startdate = datetime.now().date() - relativedelta(days=3)
transactions = Transaction.objects.filter(time__range=[startdate,enddate])
grouped_transactions = transactions.values("time__day").annotate(total=Sum('value'))
for key in grouped_transactions:
labels.append(key['time__day'])
data.append(key['total'])
return JsonResponse(
data={
'labels': labels,
'datasets': [
{
'label': 'All Transactions,
'backgroundColor': str(random_color()),
'data': data,
}
],
}
)
Я хочу создать набор данных из каждого поля Transaction.client и затем передать его как Json в ajax запрос. Как я смогу это сделать, поскольку в таблицах указаны даты, и у некоторых клиентов нет транзакций в определенные даты, а у некоторых есть. Спасибо
Вам необходимо указать пользователя в вашем фильтре. Используйте request.user.
def x_chart(request):
def random_color():
return "#"+''.join([choice('ABCDEF0123456789') for i in range(6)])
labels=[]
data=[]
enddate = datetime.now()
startdate = datetime.now().date() - relativedelta(days=3)
the_client = request.user
transactions = Transaction.objects.filter(client=the_client,time__range=[startdate,enddate])
grouped_transactions = transactions.values("time__day").annotate(total=Sum('value'))
for key in grouped_transactions:
labels.append(key['time__day'])
data.append(key['total'])
return JsonResponse(
data={
'labels': labels,
'datasets': [
{
'label': 'All Transactions,
'backgroundColor': str(random_color()),
'data': data,
}
],
}
)