有没有办法从M2M关系中获取*相关对象的PK?

时间:2016-04-18 20:23:57

标签: python django django-models django-queryset

考虑以下内容:

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而无需额外加入实际的相关表格?

2 个答案:

答案 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