在django中迭代manyToOne关系会执行数百个查询

时间:2014-02-04 06:05:13

标签: python mysql django

用户企业用户商家模型有FK。在调试工具栏中,通常所有商业 .id都在一个查询中被提取,但是当我尝试显示商家名称时,执行了数百个查询(每个查询一个用户< /强>)。

(*)我已从代码

中删除了所有不相关的原始数据

用户

class Users(models.Model):
    firstname = models.CharField(max_length=100)
    lastname = models.CharField(max_length=100)
    business = models.ForeignKey('Business', blank=True, null=True, related_name="users")

商家

class Business(models.Model):
    name = models.CharField(max_length=100)
    def __str__(self):
        return self.name

views.py

class UserList(ListView):
queryset = Users.objects.annotate(num_assets=Count('assets', distinct=True),
                                  num_tickets=Count('tickets'),
                                  )
def get_context_data(self, **kwargs):
    context = super(UserList, self).get_context_data(**kwargs)
    return context

模板

{% for user in object_list %}
     <tr>
         <td>{{ user.id }}</td>
         <td>
             {{ user.business }}
         </td>
     </tr>
{% endfor %}

这是错误的,我正在尝试为它们运行一个查询。

1 个答案:

答案 0 :(得分:2)

尝试使用select-related。我正在从文档中复制:

  

返回一个QuerySet,它将“跟随”外键关系,在执行查询时选择其他相关对象数据。这是一个性能提升器,它会导致单个更复杂的查询,但意味着以后使用外键关系不需要数据库查询。

所以你的查询集应该是这样的:

queryset = Users.objects.select_related('business ').annotate(num_assets=Count('assets',
      distinct=True),
      num_tickets=Count('tickets'),
 )