Django-python中db或compute的过滤器
假设现在我有两个模型,A和B a和B之间存在多对多关系Django-python中db或compute的过滤器,python,django,database,Python,Django,Database,假设现在我有两个模型,A和B a和B之间存在多对多关系 class B(models.Model): score_b = model.IntegerField() class A(models.Model): b = models.ManyToMany(B, related_name='b_set') score_a = models.IntegerField() name = models.CharField(unique=True) == 工作流程首先是我
class B(models.Model):
score_b = model.IntegerField()
class A(models.Model):
b = models.ManyToMany(B, related_name='b_set')
score_a = models.IntegerField()
name = models.CharField(unique=True)
==
工作流程首先是我通过score\u A
过滤一些实例,并使用它们查询Bscore\u B
因此,一段简单的代码可能是这样的(解决方案a)
但是我正在尽我最大的努力来提高表现
前面的代码似乎需要1+len(一个列表)
数据库访问
所以我会尝试使用预取相关的(解决方案B)
但是,缓存的b
似乎将被忽略,因为过滤器
是一个不同的查询。所以上面的代码一点帮助都没有
它现在需要1+1+len(一个列表)
数据库访问,因为需要额外的prefetch\u相关的
查询
现在我提出了另一个想法,即用python中的过滤器b来减少数据库访问(解决方案C)
现在数据库访问的数量应该下降到1
,这太棒了
但我担心python中的过滤器可能比数据库中的过滤器慢得多
它在解决方案C中的运行速度会比解决方案A更快吗
谢谢
编辑
我编辑了代码片段
对不起,我的英语不好,描述不好,导致误解
我的问题是,我应该始终在数据库中进行筛选,还是可以在python中进行筛选,尤其是在python可以保存一些/许多数据库访问的情况下。这应该可以通过ORM进行单个db查询:
b_list = B.objects.filter(b_score__gte=200, a__score_a__gte=100).distinct()
因此,您只需要所有具有特定分数限制的B
实例,这些实例与至少一个具有分数限制的a
关联。你想如何处理重复的?谢谢你的评论,我发现我给出了一个错误的例子。谢谢你的回复。我更新了我的问题,希望我已经讲清楚了。我想答案很清楚,在这个例子中,您只能在一个查询中运行,因此不需要用python进行计算
## Solution B
stuff = {}
a_list = A.objects.filter(score_a__gte=100).prefetch_related('b')
for a in a_list:
qs = a.b_set.filter(score_b__gte=200)
stuff[a.name] = [b.score for b in qs]
return stuff
## Solution C
stuff = {}
a_list = A.objects.filter(score_a__gte=100).prefetch_related('b')
for a in a_list:
qs = a.b_set.all()
temp = [b.score for b in qs if b.score >= 200]
stuff[a.name] = temp
return stuff
b_list = B.objects.filter(b_score__gte=200, a__score_a__gte=100).distinct()