#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"}