我有一个计算以下内容的方法。我们可以在这里使用 select_lated 或任何优化吗?
obj = []
for game in Games.objects.filter(query__health=health,created_at__gte=start_date.replace(month=month_to_consider,year=year_to_consider)).distinct().order_by('-created_at'):
data={}
data["problem"] = game.issue.issue if game.issue else ""
data["game_name"]=game.name
obj.append(data)
返回对象
最佳答案
根据您提供的信息,您访问数据库的次数存在问题,这为您提供了改进的空间。
例如,当您执行 PlCityAssociate.objects.filter(play__states__city=city...
时,您将先调用符合您条件的州,然后调用城市。这需要 3 次调用DB,每次您在 for
循环中遍历它时。
create 方法没有创建任何东西,这看起来很奇怪,但我会继续。您可能想要显示的是属于该用户的城市列表,其状态等于 A、B 或 C,并且具有客户端。
def create(self, request, *args, **kwargs):
queryset = City.objects.select_related('citystatus').filter(owner=request.user, citystatus__status__in=["A", "B", "C"], client_id__isnull=False)
res = []
for r in queryset:
res.append(self.get_cities(r))
return Response(res)
Django 允许您使用 select_lated()
即时进行连接,您可以找到更多信息 here .
第二部分,get_cities()
方法,我将其包含在 City 模型中,以便您可以为每个实例调用它,而不是通过每个 PlCityAssociate 查询集运行一个循环时间。
因此,城市模型中的新 get_cities()
方法将如下所示:
def get_cities(self ,city):
start_date = datetime.datetime.now()
pls = self.state_set.all().play_set.all().plcityassociate_set.filter(update_at__gte=start_date)
请告诉我这是否足够改进。另外,请确保测试访问数据库的次数,有多种方法可以做到这一点,但我首选的方法是 django_assert_num_queries
,这是 pytest-django
的一部分.
关于python - 使用 django 查询的内置方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60108606/