@@ -477,7 +477,9 @@ def _create_collection(self, model):
477477 # Unencrypted path
478478 db .create_collection (db_table )
479479
480- def _get_encrypted_fields (self , model , key_alt_name_prefix = None , path_prefix = None ):
480+ def _get_encrypted_fields (
481+ self , model , * , key_alt_name_prefix = None , path_prefix = None , create_data_keys = True
482+ ):
481483 """
482484 Return the encrypted fields map for the given model. The "prefix"
483485 arguments are used when this method is called recursively on embedded
@@ -488,12 +490,12 @@ def _get_encrypted_fields(self, model, key_alt_name_prefix=None, path_prefix=Non
488490 key_alt_name_prefix = key_alt_name_prefix or model ._meta .db_table
489491 path_prefix = path_prefix or ""
490492 auto_encryption_opts = client ._options .auto_encryption_opts
491- key_vault_db , key_vault_collection = auto_encryption_opts ._key_vault_namespace .split ("." , 1 )
492- key_vault_collection = client [ key_vault_db ][ key_vault_collection ]
493+ _ , key_vault_collection = auto_encryption_opts ._key_vault_namespace .split ("." , 1 )
494+ key_vault = self . get_collection ( key_vault_collection )
493495 # Create partial unique index on keyAltNames.
494496 # TODO: find a better place for this. It only needs to run once for an
495497 # application's lifetime.
496- key_vault_collection .create_index (
498+ key_vault .create_index (
497499 "keyAltNames" , unique = True , partialFilterExpression = {"keyAltNames" : {"$exists" : True }}
498500 )
499501 # Select the KMS provider.
@@ -517,22 +519,29 @@ def _get_encrypted_fields(self, model, key_alt_name_prefix=None, path_prefix=Non
517519 field .embedded_model ,
518520 key_alt_name_prefix = key_alt_name ,
519521 path_prefix = path ,
522+ create_data_keys = create_data_keys ,
520523 )
521524 # An EmbeddedModelField may not have any encrypted fields.
522525 if embedded_result :
523526 field_list .extend (embedded_result ["fields" ])
524527 continue
525528 # Populate data for encrypted field.
526529 if getattr (field , "encrypted" , False ):
527- data_key = key_vault_collection .find_one ({"keyAltNames" : key_alt_name })
528- if data_key :
529- data_key = data_key ["_id" ]
530- else :
530+ if create_data_keys :
531531 data_key = connection .client_encryption .create_data_key (
532532 kms_provider = kms_provider ,
533533 key_alt_names = [key_alt_name ],
534534 master_key = master_key ,
535535 )
536+ else :
537+ data_key = key_vault .find_one ({"keyAltNames" : key_alt_name })
538+ if data_key :
539+ data_key = data_key ["_id" ]
540+ else :
541+ raise ImproperlyConfigured (
542+ f"Encryption key { key_alt_name } not found. Have "
543+ f"migrated the { model } model?"
544+ )
536545 field_dict = {
537546 "bsonType" : field .db_type (connection ),
538547 "path" : path ,
0 commit comments