2011-02-06 183 views
1

你好 我有以下型號:Django的許多一對多查詢

class Participation(models.Model): 
    workflow_activity = models.ForeignKey('WorkflowActivity') 
    user = models.ForeignKey(User) 
    role = models.ForeignKey(Role) 
    current = models.BooleanField() 

這是許多一對多「到」表。 我要篩選具備這些條件之一的workflow_activity實例:分配

  1. 沒有用戶,即在參與表workflow_activity沒有條目
  2. 沒有當前的活躍用戶,即,所有的參與表中的workflow_activity的行有current==False

幫助建立查詢將非常感謝!

編輯:

大家好,感謝您的答覆。我想我可能接近這個事情是錯誤的。我的要求是建立一種具有自動分配功能的票務系統,該功能根據一些選擇邏輯爲用戶分配票據。我運行分配函數作爲一個週期性任務(使用芹菜),但爲此,我需要選擇當前未分配的門票當前狀態的門票。當前的布爾值用於標記特定用戶是否分配給票證的當前狀態。

關於實現這個的任何想法/想法?

EDIT2

繼承人一個我認爲:

class WorkflowActivity(models.Model): 
    ... 
    ... 
    assigned_to = models.ManytoManyField('Participation') # older table without the current field 
    current = models.ManytoManyField('Current') 

class Current(models.Model): 
    participant = models.ForeignKey('Participation') 

畏縮值得我知道,但它的我能想出的,任何其他的選擇嗎?

+0

我很感興趣,這個...我試過一些想法,但他們沒有很好地工作:) – 2011-02-06 21:49:44

回答

1

#1,這應該工作:

from django.db.models import Count 

WorkflowActivity.objects.annotate(users=Count('participation__user')).filter(users=0) 

不幸的是,不是在Django的ORM僅使用內置插件做#2的好方法。您可以嘗試擴展Count類型,如Ticket 11305中所建議的那樣。

編輯:

如果你有興趣在發現至少有一個活動User,你可以做所有WorkflowActivities

WorkflowActivity.objects.filter(participation__current=True) 
+0

如果我們反過來思考它呢?而不是所有*行都有當前的== False,只需找到*至少*一個不是假的那些。 – mpen 2011-02-06 23:39:23