Django视图中的Prefetch_related导致多余的数据库查询

时间:2018-01-30 20:32:21

标签: django django-orm

我试图在这段代码中弄清楚我做错了什么:

contacts = Contact.objects.user(request.user).prefetch_related(
                        Prefetch('contact_phone',
                                 queryset = ContactPhone.objects.order_by('value')))

    for contact in contacts:
        for contact_phone in contact.contact_phone.all():
            # do something

Django多次点击数据库。有任何想法吗 ?是不是我可以在Django模板中使用prefetch_related,并且在视图中它会多次访问数据库???

对于10个联系人,我有10个数据库命中,每个都看起来像这样:

SELECT ... FROM `contact_phone` WHERE `contact_phone`.`contact_id` = ...
ORDER BY `contact_phone`.`id` ASC LIMIT 1

所以,对我来说似乎有两件不清楚的事情。首先,为什么Django会为每个联系人访问数据库。第二,为什么它将电话号码限制为1个记录?

相应的模型如下所示:

class ContactPhone(BaseMixin):
    contact = models.ForeignKey(Contact, models.CASCADE, related_name = 'contact_phone')

1 个答案:

答案 0 :(得分:0)

每个value会收到一个查询,因为contacts = Contact.objects.user(request.user).prefetch_related( Prefetch('contact_phone', queryset = ContactPhone.objects.order_by('value'))) for contact in contacts: for contact_phone in contact.contact_phone.order_by('value'): # do something winBattle(battleCard, potCards) { this.cards.push(this.battleCard) // this one this.cards.push(battleCard) if (potCards.length) { for (let card of potCards) { this.cards.push(card) } } } 排序,而在迭代中,您不按任何属性排序。如果执行的查询与预取的查询不匹配,则完成新查询。

请参阅https://docs.djangoproject.com/en/2.0/ref/models/querysets/#prefetch-related上的说明:

  

请记住,与QuerySets一样,任何后续链接   暗示不同数据库查询的方法将先前忽略   缓存结果,并使用新的数据库查询检索数据。

为了避免额外的数据库查询,请执行以下操作:

@Named
public class MyEJBClientBean {

    @EJB(mappedName="java:global/MyApp/MyModule/MyNoInterfaceEJB!com.initech.MyNoInterfaceEJB ")
    private MyNoInterfaceEJB testejb;

  // ...