考虑以下内容:
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 :(得分:0)
您可以查看有关prefetch_related的django文档。引用文档:
另一方面,prefetch_related对每个进行单独查找 关系,并在Python中“加入”。这允许它 预取多对多和多对一对象,这是无法完成的 使用select_related,除了外键和一对一 select_related支持的关系。
所以它应该是:
post = Post.objects.filter(pk=1).prefetch_related('tags')[0]
答案 1 :(得分: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