【发布时间】:2016-09-20 20:29:58
【问题描述】:
我尝试了不同的方法来查询我的数据,但仍然会导致大量 ping 到数据库。
我尝试过使用select_related。
这是我的模型:
class Order(models.Model):
num = models.CharField(max_length=50, unique=True)
class OrderInfo(models.Model):
info = models.CharField(max_length=100, unique=True)
datetime = models.DateTimeField(auto_now_add=True, blank=True)
order_fk = models.ForeignKey(Order)
我想要达到的目标:
OrderInfo 有一堆与Order 相关的信息。
我想要的是能够从数据库中获取最新的OrderInfo,但我希望它是Order 独有的。独特的部分是我努力减少查询量的地方。
ois = OrderInfo.objects.order_by('-datetime').select_related('order_fk')
当我尝试过滤时,它正在对每个订单进行查询以检查查询的唯一性。
For instances:
_ = [oi.order_fk for oi in ois] # queries reach to 20k, takes too long.
另外,我只需要限制我收到的回复数量,但我需要先知道有多少独特的Orders 才能限制它。
任何人,都知道最小化这些查询的适当方法,否则我可能需要重组我的模型。
注意事项:
- Django 1.7
- Python 2.7
- SQLite
【问题讨论】:
-
您能否将
.query添加到查询 (ois) 的末尾并提供结果?您可以在poorsql.com 之类的网站上发布结果,以避免此处的字符限制并提供格式。一般来说,这将在 Django 创建查询时发布查询,我们可以利用它来尝试查看究竟是什么导致它查询这么多。另外,您的数据库中有多少订单?您的数据库中有多少信息对象? -
@tredzko ois 打印时是 1 个查询。
goo.gl/czqYru。当我执行 for 循环时,它每次都在执行该查询。大约有 4kOrders和大约 35kOrderInfos。 PS:不要贴短链接,原链接太长了。 -
好吧,要明确一点,您正在寻找最新的
OrderInfo对象,不管Order,但每个Order只查找一次,对吗?我不确定我能否通过设置模型的方式来帮助减少这种情况。 -
@tredzko 正确。我想要按最近的顺序排列,并且只允许 1 个订单。您对如何正确建模有什么建议吗?
-
我回复了一个答案,请回复它让我知道它是否有效,或者它是否可以帮助您找到答案。