2011-02-06 35 views
1

こんにちは I以下のモデルがあります:Djangoの多対多のクエリ

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

これは、多対多「から」テーブルです。 私はこれらの条件のいずれか1持ってworkflow_activityのインスタンスフィルタする:

  1. ありませんユーザー割り当てを、すなわち、参加テーブルでそのworkflow_activityのためノーエントリ
  2. ありません現在のアクティブユーザー、すなわち、どこのすべて参加テーブルのworkflow_activityの行には、current==False

があります。

EDIT:

ねえみんな、回答に感謝。私はおそらくこのことに間違っていると思う。私の要件は、いくつかの選択ロジックに基づいてチケットをユーザーに割り当てるオートアサイン機能を備えたチケット発券システムの構築です。私は定期的なタスク(セロリを使用して)として割り当て関数を実行していますが、私はチケットの現在の状態に対して現在割り当てられていないチケットを選択する必要があります。特定のユーザーがチケットの現在の状態に割り当てられている場合、現在のブール値がマークされます。

これを実装するためのアイデアや考えはありますか?

EDIT2

相続人は私が考える1:私が知っている

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タイプを拡張することができます。

編集:

あなたは、少なくとも1つの活性Userを持っているすべてのWorkflowActivitiesを見つけることに興味があるなら、あなたが行うことができます:

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

私たちはそれについて他の方法で考えるとどうなりますか? * all *行の代わりに、現在の== Falseがあります。*少なくとも* 1がfalseでない行を探してください。 – mpen

+0

もちろん、それは可能です。それは、#1のための私の注釈からのわずかな変更です。 –

+0

#1の場合、標準クエリを使用できます。WorkflowActivity.objects.filter(participation__isnull = True)#2は問題です。 –