2016-04-18 9 views
0

は、以下を検討:関連するオブジェクトのPKMをM2M関係から取得する方法はありますか?

class Tag(Model): 
    ... 

class Post(Model): 
    tags = ManyToManyField(Tag) # a join table "post_tags" is created 

post = Post.objects.get(pk=1) 
post.tags.all() # this will cause django to join "tag" with "post_tags" 
post.tags.values('pk') # even though pk is already in post_tags, django will still join with "tag" table 

私の必要性が唯一のPKのリストです。誰かが、サポートされている方法、または実際の関連テーブルへの追加の参加なしで私はちょうどM2MからPKsを得ることができるきれいなハックを知っていますか?

答えて

0

あなたはprefetch_relatedについてDjangoのドキュメントをチェックアウトすることができます。ドキュメント引用:

prefetch_relatedし、一方、各 関係のために別々のルックアップを行い、そしてPythonで「接合」ん。これは、外部キーとselect_relatedによってサポートされている1対1 関係に加えて、select_related使用 を行うことはできません プリフェッチ多対多および多対一のオブジェクト、それを可能にします。

だから、次のようになります。

post = Post.objects.filter(pk=1).prefetch_related('tags')[0] 
0

あなたはthrough引数を使用して関係を定義することができます。その後、

class Tag(Model): 
    pass 


class Post(Model): 
    tags = ManyToManyField(Tag, through='PostTag') 


class PostTag(Model): 
    post = models.ForeignKey(Tag) 
    tag = models.ForeignKey(Post) 

PostTag.objects.filter(post_id=1).values('tag_id') 

はこのように、単一のクエリで実行されます:

SELECT `appname_posttag`.`tag_id` FROM `appname_posttag` WHERE `appname_posttag`.`post_id` = 1 
関連する問題