2013-05-28 41 views
0

我有以下代碼:如何使示例代碼更幹?

for e in Contact.objects.filter(contact_owner=batch.user, group=batch.group): 
      msg = Message.objects.create(
       recipient_number=e.mobile, 
      ) 

不過,我想這樣做下面我檢查,其中第一,如果對象具有group如果不contact的組,而不是其他的濾網過濾有點像。

正如你所看到的,這不是非常乾燥。這怎麼能變得更好?

if self.group == None: 
     for e in Contact.objects.filter(contact_owner=batch.user, contact=batch.group): 
     msg = Message.objects.create(
      recipient_number=e.mobile, 
     ) 

else: 
    for e in Contact.objects.filter(contact_owner=batch.user, group=batch.group): 
    msg = Message.objects.create(
     recipient_number=e.mobile, 
    ) 
+0

無論你的代碼塊都做同樣的事情,那麼爲什麼你有,如果檢查? –

+1

@BurhanKhalid它在過濾的參數上有所不同。 –

+0

@Burhan Khalid過濾contact = batch.group另一個是group = batch.group,其他的都是一樣的。 – GrantU

回答

4

,你應該在你的情況考慮這個想法是從

https://docs.djangoproject.com/en/dev/topics/db/queries/#chaining-filters

採取查詢集懶惰 - 創建一個查詢集不涉及任何數據庫活動的行爲。您可以將過濾器整天堆疊在一起,並且Django實際上不會運行查詢,直到QuerySet被評估爲止。

這允許您逐個構建查詢。

q = Contact.objects.filter(contact_owner=batch.user) 
if self.group == None: 
     q = q.filter(contact=batch.group) 
else 
     q = q.filter(group=batch.group) 

for e in q: 
    msg = Message.objects.create(
     recipient_number=e.mobile, 
    ) 
+0

我明白了,那很好! – GrantU

1

您也可以使用,如果操作者,如果你喜歡這種較短的寫作

q=Contact.objects.filter(contact_owner=batch.user) 
q = q.filter(contact=batch.group) if self.group is None else q.filter(group=batch.group) 
for e in q: 
    msg = Message.objects.create(
     recipient_number=e.mobile, 
    )