2016-11-21 8 views
0

私は、次のモデルがあります:どのように私は本が特定のライブラリにあるだ著者のリストを取得します複雑なクエリ対ジャンゴ外部キー

class Library(models.Model): 
    title = models.CharField(max_length = 255) 

class Author(models.Model): 
    name = models.CharField(max_length = 255) 

class Book(models.Model): 
    name = models.CharField(max_length = 255) 
    library_id = models.ForeignKey(Library) 
    author_id = models.ForeignKey(Author) 
  1. を?
  2. ライブラリに直接外部キーを持たせる方がAuthorで効率的ですか?
+0

特定のライブラリに属する​​著者はどういう意味ですか?書籍は図書館に属しているので、「本」にFKを付けることはまったく問題ありません。しかし著者は?あなたはこれについて確信を持っていますか? – lucasnadalutti

+0

著者はなぜライブラリに固有であるのでしょうか – marcusshep

+0

私は図書館にある著者のリストを取得したいと思います。それは単なる例です。 – Tomas

答えて

0

reverse lookups across the Foreign Key relationshipsを使用して、書籍が特定のライブラリにある著者のリストを取得できます。

some_library = Library.objects.get(0) 
authors_in_library = Author.objects.filter(book__library_id=some_library) 

あなたは著者にlibraryフィールドを追加しないでください。これは時期尚早の最適化であり、書籍を新しいライブラリに移動する場合は、1つではなく2つの関係を更新する必要があるため、状況が複雑になります。あなたはトランザクションでも同様に更新を行う必要があります。測定可能な重要なパフォーマンスの問題に直面している場合を除き、これを考慮しないでください。

さらに、_idという接尾辞をフィールドに追加しないでください。彼らはDjangoで実際のオブジェクト関係として扱われます。また、id-onlyルックアップを行うためにDjango adds its own _id to foreign keysという事実と矛盾します。クエリは次のようになります。_id

Author.objects.filter(book__library=some_library) 
+0

あなたのクエリは、著者ではなく、ライブラリのリストを返します。 – Tomas

+0

あなたはそうです、ラインのどこかであなたのニーズが混ざり合っています。修正中... – Soviut

+0

ありがとう!あまり複雑でないクエリを作成するために著者にライブラリキーを追加する価値はありますか?それとも、モデルにキーを少なくして複雑なクエリを実行する方が良いでしょうか? – Tomas