2010-11-26 1 views
1

を設定しますので、この1は、説明するの少し奇妙で、私と一緒に負担してください:)コードなしで説明しようとするので、ここではあまり意味がありません。簡単な例です:Djangoの「連結」クエリが

class Employee(models.Model): 
    name = models.CharField(max_length=100) 

class Location(models.Model): 
    address = models.CharField(max_length=200) 
    employees = models.ForeignKey(Employee) 

class Company(models.Model): 
    name = models.CharField(max_length=100) 
    locations = models.ForeignKey(Location) 

ましょう特定の会社のすべての従業員をテンプレートでプリントアウトしたいとします。通常、私たちはこれを行うだろう。素晴らしいうまくいくが、この場合には、私はすべての従業員がある場合は、従業員のリストの先頭にヘッダをプリントアウトしますが、場合に、ヘッダーをオフのままにしたいと思います

{% for location in company.locations.all %} 
    {% for employee in location.employees.all %} 
     {{ employee.name }} <br/> 
    {% endfor %} 
{% endfor %} 

従業員はいません。典型的なループでは、私はforloop.firstを使用してヘッダーを表示する必要があることを示していますが、この場合は表示できません。私が外側のループ(場所)で試してみると、従業員がいないときにヘッダーが得られるかもしれません。内側のループ(従業員)で試してみると、従業員がいる場所のヘッダーしか取得できませんが、 1つのヘッダーは、リスト全体の1つのヘッダーではなく、場所ごとに1つです。

さて、これまでの私の理想的なソリューションは、すべて一緒にステップをスキップし、企業レベルから全従業員を反復処理するためにいくつかの方法を持っているだろう:

会社レベルでの employeesは、本質的に連結したものです
{% for employee in company.employees %}...{% endfor %} 

各ロケーションの従業員クエリーの設定私はカスタムマネージャーを調べましたが、このシナリオでそれらをどのように活用するかはわかりません。

うまくいけば、それはある意味があります。何か提案ありがとう!あなただけの会社の全従業員の単一クエリセットを取得するために他の方法でラウンドを(ビュー)のクエリを行うことができます

答えて

4

employees = Employee.objects.filter(location__company=company) 

をこの単一のデータベースのみヒットを必要とする追加の利点を持っています1つの場所ではなく、1つです。

+0

ありがとうございます!これは実際に質問を書いて約2分後に私に起こった、私はちょうど私が想定している問題を見ていた!私の場合、私は実際にこれをモデルクラスの関数として追加しました。これはテンプレート(上記の 'company.employees')で説明したとおりに呼び出すことができます。 – Toji