【问题标题】:Django many-to-many queryDjango 多对多查询
【发布时间】:2011-02-06 19:38:02
【问题描述】:

你好 我有以下型号:

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

这是多对多“直通”表。 我想过滤具有以下任一条件的workflow_activity 实例:

  1. 未分配用户,即参与表中没有该工作流活动的条目
  2. 当前没有活动用户,即参与表中工作流活动的所有行都有current==False

非常感谢您帮助构建查询!

编辑:

大家好,感谢您的回复。我想我可能会错误地接近这件事。我的要求是,我构建了一种具有自动分配功能的票务系统,该功能根据一些选择逻辑将用户分配给票证。我将分配功能作为定期任务运行(使用 celery),但为此我需要选择当前未分配的票证当前状态的票证。当前布尔值用于标记该特定用户是否被分配到工单的当前状态。

关于实现这个的任何想法/想法?

编辑2

这是我想到的一个:

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

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

【问题讨论】:

  • 我对这个很感兴趣...我尝试了一些想法,但效果不佳:)

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


【解决方案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)

【讨论】:

  • 如果我们反过来考虑呢?而不是所有行都有current==False,只需找到至少一个不为假的行。
  • 当然可以。这只是我对 #1 的注释的一个小改动。
  • 对于 #1,您可以只使用标准查询:WorkflowActivity.objects.filter(participation__isnull=True) #2 is... a problem。
  • @Yuji: isnull 特指一个字段的值,也就是说在这种情况下它不会按照你的想法去做。
  • @Jeff Bradberry,为什么不呢?它将返回所有有 0 个关系指向它们的 WorkflowActivity 对象。这是错的吗? (我经常使用这种语法,所以我想知道其中的陷阱!)
猜你喜欢
  • 2022-01-18
  • 2010-11-26
  • 2021-11-14
  • 2011-08-03
  • 2013-04-10
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多