2014-09-12 51 views
1

我想迭代用戶匹配實體以避免首先在幫助程序數組中分組。Django禁止過濾模型以包含符合第一條件的集合

如何從這樣的查詢我可以使User.stone_set只包含匹配過濾器的?

users = User.objects.filter(payment__due_day__lte=datetime.today()+3) 

現在,每個用戶應該只有支付實例過濾器,但users.payment_set是一個與其沒有真正關聯的經理。

澄清

這裏是我的模型:

class Payment(models.Model): 
    owner = models.ForeignKey(User) 
    due_day = models.IntegerField() 

現在,像這樣的查詢:User.objects.filter(payment__due_day=10)會給我有到期付款10天用戶現在遍歷我想它的用戶對象只有那些我第一次查詢的付款(只有那些付款日期爲due_day = 10的付款),而不再向單個用戶查詢付款。

+0

你能改說你的問題嗎?很難理解你想要達到的目標。可能是一個例子會有所幫助! – karthikr 2014-09-12 23:10:21

+0

粘貼模型,舉個例子,幫助我們來幫助你。 – 2014-09-13 01:20:20

+0

發佈了一個澄清,希望這將更詳細地解釋它 – aambrozkiewicz 2014-09-13 11:51:53

回答

3

如果我理解你的問題,最後你想要一個Payment對象的查詢集。 然後,從該模型開始,而不是User

payments = Payment.objects.filter(due_day=10).select_related('owner').order_by('owner') 

之後,你就可以遍歷查詢集,並得到各支付的所有者(用戶)沒有任何額外的查詢,因爲select_related會做後臺SQL聯接你。

如果您爲每個用戶支付多筆付款並且需要顯示該條款,則需要order_by條款。在您的模板中,您可以使用內置模板標籤regroup

例如:

# In your view (EXTREMELY simplified) 
def my_view(request): 
    payments = Payment.objects.filter(due_day=10).select_related('owner').order_by('owner') 
    return render_to_response('template.html', {'payments': payments}) 

# In your template 
{% regroup payments by owner as payment_list %} 
<ul> 
    {% for payment in payment_list %} 
    <li>{{ payment.grouper }} <!-- this is the owner --> 
     <ul> 
     {% for item in payment.list %} 
      <li>{{ item.due_day }}</li> 
     {% endfor %} 
     </ul> 
    </li> 
    {% endfor %} 
</ul> 

相反,如果你想達到,在裸露的蟒蛇,最好的解決辦法是使用itertools.groupby(這是,事實上,使用的regroup標籤)。

快速和未經考驗的例子:

from itertools import groupby 
from operator import attrgetter 

payments = Payment.objects.filter(due_day=10).select_related('owner').order_by('owner') 

for owner, grouped_payments in groupby(payments, attrgetter('owner')): 
    do_stuff_with(owner) 
    do_some_other_stuff_with(list(grouped_payments)) 

請務必閱讀的文檔。

+0

重新組合聽起來不錯!不知道。如何在裸露的python不在模板中存檔?我希望在命令中使用它。此外,我想迭代所有者以便能夠針對每個用戶在單次迭代中發送關於即將到來的付款的電子郵件。 – aambrozkiewicz 2014-09-17 11:51:18

+0

@aambrozkiewicz查看我的更新 – Germano 2014-09-17 12:04:40

+0

然後我會閱讀文檔。萬分感謝! – aambrozkiewicz 2014-09-17 12:52:10