Данные и метки диаграммы Django
В настоящее время я делаю приборную панель, которая показывает данные по сотрудникам. Я сделал функцию для получения данных диаграммы и меток, пока что мне удалось сделать метки... но я не могу получить подсчет количества повторений для каждой из дат. Мне нужно, чтобы результатом get_chart_data был список или кортеж, как например: 20/01/2022: 1,
Это означает, что в этот день в базу данных был добавлен только 1 объект, например
Код, который я пробовал до сих пор, потерпел неудачу, или дал мне подсчет до определенной даты, но ничего правильного. Важной частью является то, что диапазон дат является динамическим.
Views.py
@login_required(login_url='/accounts/login/')
def get_chart_data(request, model, data_range):
end_date = dt.localdate()
print(end_date)
start_date = dt.localdate()- timedelta(days=data_range)
print(start_date)
db_objects = model.filter(transaction_date__lte=end_date, transaction_date__gt=start_date).\
values('transaction_date').\
annotate(count=Count('purchase_id'))
print(db_objects)
amount_objects = list(db_objects)
print(amount_objects)
dates = [x.get('transaction_date') for x in amount_objects]
print(dates)
for d in (end_date - start_date for x in range(0,data_range)):
if d not in dates:
amount_objects.append({'createdate': d, 'count': 0})
data = amount_objects
return data
@login_required(login_url='/accounts/login/')
def get_label_data(request, model, data_range):
label = []
end_date = dt.localdate()
start_date = dt.localdate()- timedelta(days=data_range - 1)
delta = start_date - end_date # returns timedelta
for i in range(data_range):
day = start_date + timedelta(days=i)
day_str = day.strftime('%A')
label.append(day_str)
return label
Output:
2022-01-20
2022-01-13
C:\Users\akram\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\fields\__init__.py:1358: RuntimeWarning: DateTimeField purchase.transaction_date received a naive datetime (2022-01-13 00:00:00) while time zone support is active.
warnings.warn("DateTimeField %s.%s received a naive datetime "
C:\Users\akram\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\fields\__init__.py:1358: RuntimeWarning: DateTimeField purchase.transaction_date received a naive datetime (2022-01-20 00:00:00) while time zone support is active.
warnings.warn("DateTimeField %s.%s received a naive datetime "
<QuerySet [{'transaction_date': datetime.datetime(2022, 1, 17, 8, 24, 31, tzinfo=<UTC>), 'count': 1}, {'transaction_date': datetime.datetime(2022, 1, 16, 8, 16, 42, tzinfo=<UTC>), 'count': 1}, {'transaction_date': datetime.datetime(2022, 1, 16, 8, 14, 7, tzinfo=<UTC>), 'count': 1}, {'transaction_date': datetime.datetime(2022, 1, 15, 8, 13, 15, tzinfo=<UTC>), 'count': 1}]>
[{'transaction_date': datetime.datetime(2022, 1, 17, 8, 24, 31, tzinfo=<UTC>), 'count': 1}, {'transaction_date': datetime.datetime(2022, 1, 16, 8, 16, 42, tzinfo=<UTC>), 'count': 1}, {'transaction_date': datetime.datetime(2022, 1, 16, 8, 14, 7, tzinfo=<UTC>), 'count': 1}, {'transaction_date': datetime.datetime(2022, 1, 15, 8, 13, 15, tzinfo=<UTC>), 'count': 1}]
[datetime.datetime(2022, 1, 17, 8, 24, 31, tzinfo=<UTC>), datetime.datetime(2022, 1, 16, 8, 16, 42, tzinfo=<UTC>), datetime.datetime(2022, 1, 16, 8, 14, 7, tzinfo=<UTC>), datetime.datetime(2022, 1, 15, 8, 13, 15, tzinfo=<UTC>)]
[20/Jan/2022 10:35:30] "GET /pwl-access/view-all-purchases/ HTTP/1.1" 200 29402
В приведенном выше выводе он показывает 1 для каждой даты, но это неверно. Также важно отметить, что функции должны показывать 0, если для этой даты не было ни одного случая. Я вызываю функции следующим образом:
chart_data = get_chart_data(request, view_all_objects, int(7) )
chart_labels = get_label_data(request, view_all_objects, int(7) )
Любая помощь будет очень признательна.
Очень просто и элегантно, я решил эту проблему с помощью следующих функций:
def extract_labels_data_set_from_model_data(data,start_date,end_date):
all_dates = []
graph_data = None
incoming_data = [str(x) for x in data]
while start_date<end_date:
start_date = start_date + datetime.timedelta(days=1)
all_dates.append(start_date.date())
if data:
data = data + [x for x in all_dates if x not in data]
if data:
data = list(sorted(data))
data = dict(Counter(data))
labels = list(data.keys())
data_set = list(data.values())
graph_data = {
"labels":[str(x) for x in labels],
"data_set":[str(x) for x in data_set],
"start_date":str(start_date),
"end_date":str(end_date),
"total_price":str(total_price),
}
extra_dates = [str(x) for x in graph_data ['labels'] if x not in incoming_data]
for index,x in enumerate(graph_data['labels']):
if x in extra_dates:
graph_data['data_set'][index] = 0
print("-> Graph Data",graph_data)
return json.dumps(graph_data)
def get_interval_based_model_data(request=None,start_date=None,end_date=None,model_name=None):
data = None
if request is not None:
start_date = request.GET['start_date']
end_date = request.GET['end_date']
model_name = request.GET['model_name']
try:
start_date = make_aware(datetime.datetime.strptime(start_date, '%Y-%m-%d'))
end_date = make_aware(datetime.datetime.strptime(end_date, '%Y-%m-%d'))
if str(model_name).lower() == 'enquiries'.lower():
data = enq.objects.filter(date_submitted__gte=start_date,date_submitted__lte=end_date).order_by('date_submitted').values('date_submitted')
print("->Records Found = ", data.count())
data = [x['date_submitted'].date() for x in data]
if request is None:
return extract_labels_data_set_from_model_data(data,start_date,end_date)
except Exception as e:
print(e)
pass
return JsonResponse({'graph_data':extract_labels_data_set_from_model_data(data,start_date,end_date)})
В случае, если у кого-то возникли трудности при выполнении этого задания.