[英]Django model methods(Date filter)
現在已經為這個問題苦苦掙扎了幾個星期,開始覺得我永遠無法解決它。
我的model下有這些方法。
def sfget_totals(self):
return self.agent_sale.filter(Date_created__range=["2022-03-01","2022-04-02"]).count()
def sfget_confirmed(self):
return self.agent_sale.filter(State="Confirmed",Date_created__range=["2022-03-01","2022-04-02"]).count()
def sfget_debi(self):
return self.agent_sale.filter(AcknowledgeQA=True,State="Confirmed",Debi_status="Accepted",Date_created__range=["2022-03-01","2022-04-02"]).count()
def sfget_requested(self):
return self.agent_sale.filter(Debi_status="Requested",Date_created__range=["2022-03-01","2022-04-02"]).count()
def sfget_cancelled(self):
return self.agent_sale.filter(State="Cancelled",Date_created__range=["2022-03-01","2022-04-02"]).count()
def sfget_pending(self):
return self.agent_sale.filter(State="Pending",Date_created__range=["2022-03-01","2022-04-02"]).count()
在上面的示例中,我手動輸入日期(它可以工作並返回正確的查詢)問題是我仍然不知道如何讓用戶通過網站插入這些日期。
這是我的看法。
def Team_stats(request,pk):
sd = request.GET.get("from")
ed = request.GET.get("to")
start_date = datetime.datetime.strptime(sd, "%Y-%m-%d").date()
end_date = datetime.datetime.strptime(ed, "%Y-%m-%d").date()
if start_date == None or end_date == None:
sales_agent = SalesAgent.objects.filter(Team_leader=pk)
return render(request,"Sales/Team_detail_page.html",{"sales_agent":sales_agent})
else:
sales_agent = SalesAgent.objects.filter(Team_leader=pk,agent_sale__Date_created__range=[start_date,end_date]).distinct()
print(type(start_date))
return render(request,"Sales/Team_detail_page.html",{"sales_agent":sales_agent})
這是我的模板。 我需要渲染團隊領導下的所有代理和另一個 model 的特定字段。例如 State,Date_Created,Debi_status。
<form method="GET" action=".">
<div class="form-row">
<div class="form-group col-md-6">
<label for="inputEmail4">Start date</label>
<input type="date" format='%Y-%m-%d' name="from" class="form-control" id="inputEmail4" placeholder="Start Date">
</div>
<div class="form-group col-md-6">
<label for="inputEmail4">End date</label>
<input type="date" format='%Y-%m-%d' name="to" class="form-control" id="inputEmail4" placeholder="End date">
</div>
</div>
<button type="submit" class="btn btn-primary">Search</button>
</form>
<!-- <p>THERE SHOULD BE A GRAPH IN HERE FOR THE AGENTS STATS</p> -->
<br>
<br>
<div class="container">
<table class="table table-dark table-striped table-bordered">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Agent Name</th>
<th scope="col">Total sales</th>
<th scope="col">Total debis</th>
<th scope="col">Total confirmed</th>
<th scope="col">Total requested</th>
<th scope="col">Total pending</th>
<th scope="col">Total cancelled</th>
</tr>
</thead>
{% for entry in sales_agent %}
<tbody>
<td>{{forloop.counter}}</td>
<td>{{entry.SA_name}}</td>
<td>{{entry.sfget_totals}}</td>
<td>{{ entry.sfget_debi}}</td>
<td>{{ entry.sfget_confirmed}}</td>
<td>{{ entry.sfget_requested}}</td>
<td>{{ entry.sfget_cancelled}}</td>
<td>{{ entry.sfget_pending}}</td>
{%endfor%}
</table>
<div>
<a type="button" class="btn btn-dark btn-m" href="{%url 'Sales:salesdash'%}">Go back</a>
{%endblock%}
我不知道如何做得更好。 這不是最佳答案,因為您必須遍歷整個查詢集。 但我認為它有效:
1- 更改模型方法,添加變量“from”和“to”:
#example
def sfget_totals(self, from, to): #
return self.agent_sale.filter(Date_created__range=[from,to]).count()
2- 在您的 views.py 中,迭代並將新屬性添加到查詢集的每個項目:
def Team_stats(request,pk):
sd = request.GET.get("from")
ed = request.GET.get("to")
start_date = datetime.datetime.strptime(sd, "%Y-%m-%d").date()
end_date = datetime.datetime.strptime(ed, "%Y-%m-%d").date()
if start_date == None or end_date == None:
sales_agent = SalesAgent.objects.filter(Team_leader=pk)
return render(request,"Sales/Team_detail_page.html",{"sales_agent":sales_agent})
else:
sales_agent = SalesAgent.objects.filter(Team_leader=pk,agent_sale__Date_created__range=[start_date,end_date])
for s in sales_agent:
s.sfget_totals_prop = s.sfget_totals(start_date,end_date)
s.sfget_confirmed_prop = s.sfget_confirmed(start_date,end_date)
s.sfget_debi_prop = s.sfget_debi(start_date,end_date)
....
....
return render(request,"Sales/Team_detail_page.html",{"sales_agent":sales_agent})
3- 在您的模板中,通過新屬性更改方法名稱:
<td>{{entry.sfget_totals_prop}}</td>
<td>{{ entry.sfget_debi_prop}}</td>
<td>{{ entry.sfget_confirmed_prop}}</td>
<td>{{ entry.sfget_requested_prop}}</td>
<td>{{ entry.sfget_cancelled_prop}}</td>
<td>{{ entry.sfget_pending_prop}}</td>
也許,您可以使用 Django Managers https://docs.djangoproject.com/en/4.0/topics/db/managers/解決問題,您會找到更好的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.