python - 使用 django 查询的内置方法

标签 python django optimization django-models query-optimization

我有一个计算以下内容的方法。我们可以在这里使用 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/

相关文章:

python - 我的算法的时间复杂度计算

python - 测试 Django 时仅针对特定版本显示弃用警告

c - gcc 的哪个 -O3 优化标志启用 "hardware accelerated instructions"

python - 设置 Django 以使用 MySQL

Django 2.0 自定义 url 正则表达式

c++ - 使用 -O3 或 -Ofast 来编译基准代码是否现实,或者它会删除代码吗?

java - JVM/编译器优化对象未使用的属性

python - 程序启动时执行的 Atexit 函数

python - ModuleNotFoundError : No moudle name <name> in docker python

python - 如何将数据框列转置为 Pandas 中的行