Django 如何使用单个查询集获取关系模型中的所有相关对象?

Django 如何使用单个查询集获取关系模型中的所有相关对象?,django,django-models,django-queryset,django-orm,Django,Django Models,Django Queryset,Django Orm,我想用一个queryset从一个用户模型中获取所有对象,但我不知道怎么做 我有一个2关系模型到用户模型, 我可以用下面的代码获取对象 User.objects.get(id=1).profile User.objects.get(id=1).groups 但是,如何仅使用单个查询集获取用户的所有对象?使用选择相关的和预取相关的,如下所述: 但是请注意,由于用户组是一种m2m关系,因此在任何情况下都会两次命中数据库。如果您只获取一个特定的用户,那么添加与预取相关的prefetch\u并没有真正的

我想用一个queryset从一个用户模型中获取所有对象,但我不知道怎么做

我有一个2关系模型到用户模型, 我可以用下面的代码获取对象

User.objects.get(id=1).profile
User.objects.get(id=1).groups

但是,如何仅使用单个查询集获取用户的所有对象?

使用
选择相关的
预取相关的
,如下所述:

但是请注意,由于
用户
是一种m2m关系,因此在任何情况下都会两次命中数据库。如果您只获取一个特定的用户,那么添加与预取相关的
prefetch\u
并没有真正的区别。如果在用户列表中循环,则情况会有所不同,因为获取所有m2m相关组只需要一个查询,而不是每个用户一个查询:

users = User.objects.select_related('profile').prefetch_related('groups')\
     .filter(is_staff=True)
for user in users:  # 2 queries
    print(user.profile)
    for group in user.groups:  # no database query
        print(group.name)

您可以使用以下格式的双下划线访问queryset中多个外部字段数据的数据

columnname.referred.table__reference_column


class DigitalApplicationsAndPlatform(models.Model):    
    digital_area = models.ForeignKey(MasterDigitalProductsAreas, on_delete=models.CASCADE)    
    keywords = models.ManyToManyField("MasterKeyword", blank=True, related_name="digital_keyword")
查询集:

m = models.DigitalApplicationsAndPlatform.objects.filter(id=1).values('digital_product', 'digital_area__digital_area', 'keywords__keyword')
<QuerySet [{'digital_product': '10,000ft Insights', 'digital_area__digital_area': 'Productivity & Collaboration', 'keywords__keyword': '_10000ft Insights_'}, {'digital_product': '10,000ft Insights', 'digital_area__digital_area': 'Productivity & Collaboration', 'keywords__keyword': '_10K Insights_'}, {'digital_product': '10,000ft Insights', 'digital_area__digital_area': 'Productivity & Collaboration', 'keywords__keyword': '_10,000ft Insights_'}, {'digital_product': '10,000ft Insights', 'digital_area__digital_area': 'Productivity & Collaboration', 'keywords__keyword': "_10K' Insights_"}]>
上面的查询集将有数字产品、数字区域和数字区域的多个值,因为关键字字段有很多关系

结果:

m = models.DigitalApplicationsAndPlatform.objects.filter(id=1).values('digital_product', 'digital_area__digital_area', 'keywords__keyword')
<QuerySet [{'digital_product': '10,000ft Insights', 'digital_area__digital_area': 'Productivity & Collaboration', 'keywords__keyword': '_10000ft Insights_'}, {'digital_product': '10,000ft Insights', 'digital_area__digital_area': 'Productivity & Collaboration', 'keywords__keyword': '_10K Insights_'}, {'digital_product': '10,000ft Insights', 'digital_area__digital_area': 'Productivity & Collaboration', 'keywords__keyword': '_10,000ft Insights_'}, {'digital_product': '10,000ft Insights', 'digital_area__digital_area': 'Productivity & Collaboration', 'keywords__keyword': "_10K' Insights_"}]>
您可以使用下面的提示来处理上面的查询集

  • 选择_related-作为外键和OneToOne字段
  • 预取_相关-用于多个和反向查找
下面的官方文件将给出访问相关数据的一些想法