Можно ли извлекать данные и отображать их в виде графика из REST API, используя только Django?

#django #charts #django-filter

#django #Диаграммы #django-filter

Вопрос:

Потому что у меня есть диаграмма в моем приложении django. У меня также есть django-filter в моем rest_framework. где я могу фильтровать даты. start_date=$start_dateamp;end_date=$end_date

из типичных данных get.

 def view_info(request):
    objs = test.objects.all()
    return render(request, 'test.html', {'objs': test})
 

Я хочу получить данные непосредственно по URL-адресу REST API
localhost:8000/api/test/?start_date=$startamp;end_date=$end

Возможно ли это? вот как я извлекаю данные из своей диаграммы.

 <script>
    $(document).ready(function(){
    var ctx = document.getElementById('myChart').getContext('2d');
    var myChart = new Chart(ctx, {
        type: 'bar',
        data: {
            labels: [{% for i in objs %}'{{i.timestamp}}',{% endfor %}],
            datasets: [{
                label: 'Rainfall Graph',
                data: [{% for i in objs %}'{{i.amount}}',{% endfor %}],
                backgroundColor: [
                    'rgba(255, 99, 132, 0.2)',
                    'rgba(54, 162, 235, 0.2)',
                    'rgba(255, 206, 86, 0.2)',
                    'rgba(75, 192, 192, 0.2)',
                    'rgba(153, 102, 255, 0.2)',
                    'rgba(255, 159, 64, 0.2)'
                ],
                borderColor: [
                    'rgba(255, 99, 132, 1)',
                    'rgba(54, 162, 235, 1)',
                    'rgba(255, 206, 86, 1)',
                    'rgba(75, 192, 192, 1)',
                    'rgba(153, 102, 255, 1)',
                    'rgba(255, 159, 64, 1)'
                ],
                borderWidth: 1
            }]
        },
        options: {
            scales: {
                yAxes: [{
                    ticks: {
                        beginAtZero: true
                    }
                }]
            }
        }
    });
    });
</script>
 

Ответ №1:

Вот, на мой взгляд, самый простой способ сделать это:

views.py

 
# inherits APIView, ModelViewSet, etc.
class View(...):

    # override get_queryset method like so:
    def get_queryset(self):
        
        queryset = self.queryset
        custom_filter = self.request.query_params.get('filter')
        
        if custom_filter: 
            custom_filter = json.loads(custom_filter)
            queryset = queryset.filter(**custom_filter)
        
        return queryset
 

Затем мы можем фильтровать из javascript следующим образом:

script.js

 // create the django-like filter:
var filter = JSON.stringify({
  'start_date__gte' : '2020-01-01',
  'end_date__lte' : '2020-12-31',
})

var url = '.../api/test?filter='   filter;
 

Ваш URL-адрес будет выглядеть так:
.../api/test?filter={"start_date__gte":"2020-01-01","end_date__lte":"2020-12-31"}