2011-09-12 8 views
1

Djangoは戻り、多くの値をフィルタし、私は、これは単純な質問だと思う - 私はこれを作ってるんだ私はDjangoのために新たなんだ

class Link_Book_Course(models.Model): 
    book = models.ForeignKey(Book) 
    course = models.ForeignKey(Course) 
    image = models.CharField(max_length = 200, null=True) 
    rating = models.CharField(max_length = 200,null=True) 
    def __unicode__(self): 
     return self.title 
    def save(self): 
     self.date_created = datetime.now() 
     super(Link_Book_Course,self).save() 

を - 私は、次のようにコード化された中間クラスを持っている

私は本の著者のすべてを持っている必要がしたいと、それは著者のすべてのクエリセットを返しません、しかし

storeOfAuthorNames = Link_Book_Course.objects.filter(book__author) 

(書籍CharFieldですと、著者と別のモデルである)を呼び出します実際には、エラーをスローします。

book__authorには複数の価値があると思いますが、どうすればそれらをすべて取得できますか?

ありがとうございます!

+0

あなたは、特定の本のすべての著者または少なくともLink_Book_Courseで参照される本のすべての著者に質問しますか? – ftartaggia

答えて

0

を使用しようとしているフィルタ法は、多かれ少なかれ、このようなSQLに変換:

Link_Book_Course INNER FROM

SELECT *ブックON(...)に参加WHERE Book.author =;

あなたのクエリには不完全なwhere句があることがわかります。

とにかく、それはあなたが探しているクエリではありません。

(仮定著者はブックの単純なテキストフィールドであり、あなたがLink_Book_Courseインスタンスから参照冊の唯一の著者をしたい)のようなものについてはどう:

Book.objects.filter(pk__in = Link_Book_Course.objects.all() values_list( "book"、flat = True))values_list( "author"、flat = True)

+0

このようなクエリを使用することはお勧めできませんが、効率的ではありません。 –

+0

が正しい。なにか提案を? – ftartaggia

+0

ああ、ええ、nrabinowitzの答えがポイントを得る! – ftartaggia

0

フィルタステートメントは、いくつかのパターンに一致するフィールドをフィルタリングします。したがって、書籍に単純なForeignKey of Authorがある場合、
storeOfAuthorNames = Link_Book_Course.objects.filter(book__author="Stephen King")を持つことができますが、
storeOfAuthorNames = Link_Book_Course.objects.filter(book__author)だけではありません。

あなたがそれを乗り越えるたら、私は本を推測していますがManyToManyField、ないForeignKey(本は複数の著者を持つことができ、そして著者が複数の本を出版することができますので?)その場合には、ちょうどfilter(book__author="Stephen King")はまだしませんとして著者を持っています足ります。お試しくださいLink_Book_Course.objects.filter(book_author__in=myBookObject.author.all())

3

私はあなたが正しいquerysetメソッドを使用しているとは思わない。引数によってfilter()フィルタ - ので、予想される使用がある:あなたがすべての特定のコースで使用される本の著者名のリストを引くしようとしているよう

poe = Author.objects.get(name='Edgar Allen Poe') 
course_books_by_poe = Link_Book_Course.objects.filter(book__author=poe) 

に見えます(または多分すべてのコースを?) 。おそらく.values()またはvalues_list()を探しているのでしょうか?

all_authors_in_courses = Link_Book_Course.objects.values_list(
     'book__author', flat=True 
    ).distinct() 

編集:@のftartaggiaの提案ごとに更新)

+0

最後のステートメントにdistinct()を追加するのはどうでしょうか?便利な場合はvalues_list( 'book_author'、flat = True)を使用しますか? – ftartaggia

+0

@ftartaggia - 両方の良い提案が含まれています。 – nrabinowitz

1

他の人がすでに説明したように、フィルタ法の使用は、オブジェクトのセット全体のサブセットを取得することであり、他のインスタンスを返しません。モデル(関係なく、関連するオブジェクトの場合またはそう)

あなたが戻ってDjangoのORMから著者モデルのインスタンスを持ちたいとあなたは集計のAPIを使用することができるなら、あなたはこのような何かをしたいかもしれません:

from django.db.models import Count 
Author.objects.annotate(num_books=Count('book')).filter(num_books__gt=1) 
関連する問題