Django-python中db或compute的过滤器

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) == 工作流程首先是我

假设现在我有两个模型,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)
==

工作流程首先是我通过
score\u A
过滤一些实例,并使用它们查询B
score\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()