我想在django中工作时减少实际的数据库命中,所以我创建了这个人工示例来概述问题。该模型如下所示:
class Car(models.Model):
name = models.CharField(max_length=10)
user = models.ForeignKey(User)
在我看来,我想做这样的事情:
def cartest(request):
cars = Car._default_manager.filter(user__username__exact='michael')[:5]
first_car_name = cars[0].name
another_car = cars[1]
return HttpResponse(len(connection.queries))
所以我想从数据库中选择5个条目,用第一个条目做一些事情,然后用第二个做一些事情(记住这是一个人为的例子)。必须有一些方法可以做到这一点,而不是两次击中数据库,对吗?
谢谢, 麦克
答案 0 :(得分:2)
def cartest(request):
cars = list(Car._default_manager.filter(user__username__exact='michael')[:5])
first_car_name = car[0]
another_car = car[1]
return HttpResponse(len(connection.queries))
答案 1 :(得分:1)
您是否实际遇到了性能问题,或者您只关心应用程序未来的可伸缩性?
正如Tim Wardle所说previously,不要试图过早地优化。利用节省的开发时间,Django可以让您更快地将应用程序推出门外。一旦你有用户,然后看看你的瓶颈是否正在尝试修复它们。
但是,如果您实际遇到性能问题,我会查看Queryset对update multiple objects at once和获取数据in bulk的能力。
至少one rejected ticket我知道这可能会帮助你(取决于你的数据库系统)。
你总是可以将Django的ORM拉出来并用SQLAlchemy替换它。
This post(可能是NSFW)有一些关于制作高性能Django应用程序的指针。
詹姆斯·贝内特(James Bennett)总体上对缩放有一些好处,其中一些约为ORM performance。