Как фильтровать и добавлять несколько наборов данных с помощью 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,
            }
        ],          
    }
)
Вернуться на верх