2016-09-26 4 views
2

このような何か:クエリセットフィルタ(複数の1対多の関係を)

class Team(models.Model): 
    name = models.CharField() 

class TeamPosition(models.Model): 
    description = models.CharField() 
    team = models.ForeignKey(Team) 

class Player(models.Model): 
    teamposition = models.ForeignKey(TeamPosition) 
    team = models.ForeignKey(Team) 
    joined_date = models.DateField() 
    left_date = models.DateField(blank=True, null=True) 
    person = models.ForeignKey(Person) 

class Person(models.Model): 
    name = models.CharField() 

I

私がTeamPositionオブジェクトから開始すると、わかりやすくなります(ただし、私にチームのクエリセットは与えません)。

サンプルデータセット:

オブジェクトセット1:

Team(name="Apples") 
    TeamPosition(team="Apples", description="Forward") 
     Player(team="Apples", teamposition="Forward", joined_date="2014-01-01", left_date=null, person="Bob") 
    TeamPosition(team="Apples", description="Defense") 
     Player(team="Apples", teamposition="Defense", joined_date="2014-01-01", left_date=2015-01-01, person="John") 
     Player(team="Apples", teamposition="Defense", joined_date="2015-01-01", left_date=2017-01-01, person="Paul") 
    TeamPosition(team="Apples", description="Goalie") 
     Player(team="Apples", teamposition="Goalie", joined_date="2014-01-01", left_date=2015-01-01, person="Jane") 

オブジェクトセット2:

Team(name="Pears") 
    TeamPosition(team="Pears", description="Forward") 
     Player(team="Pears", teamposition="Forward", joined_date="2014-01-01", left_date=null, person="Carol") 
    TeamPosition(team="Pears", description="Defense") 
     Player(team="Pears", teamposition="Defense", joined_date="2015-01-01", left_date=2017-01-01, person="Bill") 
    TeamPosition(team="Pears", description="Goalie") 
     Player(team="Pears", teamposition="Goalie", joined_date="2014-01-01", left_date=null, person="Susan") 

オブジェクトセット3:

Team(name="Oranges") 
    TeamPosition(team="Oranges", description="Forward") 
    TeamPosition(team="Oranges", description="Forward") 
    TeamPosition(team="Oranges", description="Goalie") 

オブジェクトセット4:

チームが利用可能TeamPositionsを持って

  • Team(name="Bananas") 
        TeamPosition(team="Bananas", description="Forward") 
         Player(team="Bananas", teamposition="Forward", joined_date="2014-01-01", left_date=null, person="Joe") 
        TeamPosition(team="Bananas", description="Defense") 
         Player(team="Bananas", teamposition="Defense", joined_date="2015-01-01", left_date=2017-01-01, person="Angela") 
        TeamPosition(team="Bananas", description="Goalie") 
         Player(team="Bananas", teamposition="Goalie", joined_date="2014-01-01", left_date="2016-09-30", person="Kelly") 
    

    だからそれらのオブジェクトに基づいて、私は次のような結果を期待しますか? (現在のプレーヤーなしTeamPositionを意味可能)

    チームは、現在のプレーヤーとの完全なすべてのTeamPositionsを持って

    Queryset should return Object 1 (Apples) and Object 3 (Oranges)

  • ?チームは30日に空TeamPositionを持つことになります(上記の反対側)(現在の意味、将来的に何left_dateやleft_dateのいずれかを持っていないプレイヤー)

    Queryset should return Object 2 (Pears) and Object 4 (Bananas)

  • ?それがより明確になります

    Queryset should return Object 4 (Bananas)

うまくいけば。

注:以前の車の例(したがって、最初の応答を)持っていたが、不明ではそう

答えて

0

一つの質問に答える前に、より良い例を作成したように見えた:ライン carmodel = models.ForeignKey(Model)はOKか?代わりに ForeignKey(CarModel)である必要がありますか?

from datetime import datetime 
CarCompany.objects.filter(carmodel__modelyear__last_availability__gte=datetime.now()) 

の両方をチェックするために last_availabilityは、将来的にまたはブランク/ヌルであるかどうか、私はなります

(これはあなたのCarCompanyはそのCarModelのModelYearのlast_availability日付が未来にあるオブジェクトのすべてを与える必要があり、この文字列で検索してくださいQ objects使用:

from django.db.models import Q 
CarCompany.objects.filter(Q(carmodel__modelyear__last_availability__gte=datetime.now()) | 
          Q(carmodel__modelyear__last_availability__isnull=True)) 

をあなたの第二の例では、私が考えることはできませんが、同じクエリで(それは、あなたの質問に答えWhich Teams have open TeamPositions?とあなたが右CarModelされているはずだ3210)

しかし、私はあなたがそれを少し説明できる場合は、Which Teams have no TeamPositions without current Players?によって何を意味するのかわからないんだけど...

Team.objects.filter(Q(teamposition__player__left_date__gte=datetime.now()) | 
        Q(teamposition__player__left_date__isnull=True) | 
+0

。私はこれを試してみる..! – Programming123

+0

Ranはクイックテストで、正確な= ''を削除しました(ダンゴが私に思い出させる空白の場合、日付はいつもヌルです)、distinct()を追加しました。しかし、私はすべてのテスト対象を元に戻してしまいました。私は私の質問を編集して、より明確な別のクラスのクラスを追加しています。 – Programming123

+0

なぜそのクエリが機能しないのかわかりません。私はとにかく私の答えを更新しました。 2番目の例の意味で、「どのチームに現在のプレーヤーがないTeamPositionsがないのですか」を明確にすることはできますか? – vabada