get_db_prep_lookup call get_prep_value twice for each value if prepared == False
In db.models.fields.Field get_db_prep_lookup()
check if value is prepared and prepare it:
def get_db_prep_lookup(self, lookup_type, value, connection, prepared=False):
"Returns field's value prepared for database lookup."
if not prepared:
value = self.get_prep_lookup(lookup_type, value)
get_prep_lookup()
call get_prep_value()
for every value.
But look next:
elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte'):
return [self.get_db_prep_value(value, connection=connection, prepared=prepared)]
elif lookup_type in ('range', 'in'):
return [self.get_db_prep_value(v, connection=connection, prepared=prepared) for v in value]
Prepared flag not changed and get_db_prep_value()
call get_prep_value()
through get_db_prep_value()
again!
I think get_db_prep_lookup()
should call get_db_prep_value()
always with prepared == True
.
elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte'):
return [self.get_db_prep_value(value, connection=connection, prepared=True)]
elif lookup_type in ('range', 'in'):
return [self.get_db_prep_value(v, connection=connection, prepared=True) for v in value]
This bug is still unnoticed because in standard ORM get_db_prep_lookup()
always calls with prepared == True
.
Fix with a regression test.