簡體   English   中英

Django model 方法(日期過濾器)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM