2011-02-06 176 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