我试图在这段代码中弄清楚我做错了什么:
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')
答案 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;
// ...