Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较A型和x27型;模型B和x27中的s字段值;斯菲尔德·德扬戈_Python_Django_Django Queryset - Fatal编程技术网

Python 比较A型和x27型;模型B和x27中的s字段值;斯菲尔德·德扬戈

Python 比较A型和x27型;模型B和x27中的s字段值;斯菲尔德·德扬戈,python,django,django-queryset,Python,Django,Django Queryset,我在“A”型和“B”型中都有10万条记录 例: 我想用A的值得到B的对象 比如说 all_a = A.objects.all() for a in all_a: b = B.objects.filter(user_email=a.user_email, user_mobile=a.user_mobile) 这很好,我正在得到结果。但由于它有10万张唱片,这花费了太多的时间。for循环迭代需要时间。在django中有没有更快的方法来实现这一点?如果您对缓存A模型不感兴趣,可以使用迭代器()

我在“A”型和“B”型中都有10万条记录

例:

我想用A的值得到B的对象

比如说

all_a = A.objects.all()
for a in all_a:
   b = B.objects.filter(user_email=a.user_email, user_mobile=a.user_mobile)

这很好,我正在得到结果。但由于它有10万张唱片,这花费了太多的时间。for循环迭代需要时间。在django中有没有更快的方法来实现这一点?

如果您对缓存A模型不感兴趣,可以使用
迭代器()
提高性能(请参阅以获取参考):

你能行

import operator
from django.db.models import Q

q = A.objects.all().values('user_email', 'user_mobile')
B.objects.filter(reduce(operator.or_, [Q(**i) for i in q]))

如果要对每个
b
对象执行某些操作,则取决于
a
。这不是方法。

可以获得a中每个值的列表,并使用这些值筛选b

a = A.objects.all()
emails = list(a.values_list('user_email', flat=True))
mobiles = list(a.values_list('user_mobile', flat=True))

b = B.objects.filter(user_email__in=emails, user_mobile__in=mobiles)

但是,如果你确保电子邮件和手机在A中是唯一的,并且每个B中的电子邮件和手机都基于A'模式中的一个,那么你就不会有任何问题

您实际使用循环的目的是什么?当你得到它时,你用
b
做什么?它只是用来比较交易。没什么了,仍然是n+1查询,在OP的情况下是100K+1。我需要对象a。需要用一些值来更新它。
import operator
from django.db.models import Q

q = A.objects.all().values('user_email', 'user_mobile')
B.objects.filter(reduce(operator.or_, [Q(**i) for i in q]))
a = A.objects.all()
emails = list(a.values_list('user_email', flat=True))
mobiles = list(a.values_list('user_mobile', flat=True))

b = B.objects.filter(user_email__in=emails, user_mobile__in=mobiles)