2016-04-18 49 views
0

考慮如下:有沒有辦法從M2M關係中獲取* only *相關對象的PK?

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獲取PK而無需額外連接到實際的相關表格?

回答

0

您可以結帳django doc約prefetch_related。引用文檔:

prefetch_related,在另一方面,做一個單獨的查找每個 關係,並且確實在Python「接合」。這使得它可以預取多對多和多對一的對象,除了select_related支持的外鍵和一對一關係外,還可以使用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 
相關問題