Django多对多查询

时间:2011-02-06 19:38:02

标签: django django-models many-to-many

您好 我有以下模型:

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
  3. 非常感谢帮助构建查询!

    修改

    嘿大家,谢谢你的回复。我想我可能接近这个错误了。我的要求是我建立一种具有自动分配功能的票务系统,该功能根据一些选择逻辑将用户分配给票据。我将assign函数作为周期性任务运行(使用celery),但为此我需要选择当前未分配给票证当前状态的票证。当前布尔值用于标记该特定用户是否已分配给故障单的当前状态。

    有关实施此问题的任何想法/想法?

    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')
    

    我知道,这是值得一提的,但我能提出的还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

对于#1,这应该有效:

from django.db.models import Count

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

不幸的是,在Django的ORM中只使用内置函数来做#2没有好方法。您可以尝试按Ticket 11305中的建议扩展Count类型。

修改

如果您有兴趣查找至少有一个有效WorkflowActivities的所有User,您可以这样做:

WorkflowActivity.objects.filter(participation__current=True)