summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/db/models/lookups.py3
-rw-r--r--tests/lookup/tests.py4
2 files changed, 6 insertions, 1 deletions
diff --git a/django/db/models/lookups.py b/django/db/models/lookups.py
index 22dd56ced9..fa4561dabf 100644
--- a/django/db/models/lookups.py
+++ b/django/db/models/lookups.py
@@ -6,6 +6,7 @@ from django.core.exceptions import EmptyResultSet
from django.db.models.expressions import Func, Value
from django.db.models.fields import DateTimeField, Field, IntegerField
from django.db.models.query_utils import RegisterLookupMixin
+from django.utils.datastructures import OrderedSet
from django.utils.functional import cached_property
@@ -326,7 +327,7 @@ class In(FieldGetDbPrepValueIterableMixin, BuiltinLookup):
if self.rhs_is_direct_value():
try:
- rhs = set(self.rhs)
+ rhs = OrderedSet(self.rhs)
except TypeError: # Unhashable items in self.rhs
rhs = self.rhs
diff --git a/tests/lookup/tests.py b/tests/lookup/tests.py
index 1d2a78c717..45360963b2 100644
--- a/tests/lookup/tests.py
+++ b/tests/lookup/tests.py
@@ -556,6 +556,10 @@ class LookupTests(TestCase):
):
list(Article.objects.filter(id__in=Article.objects.using('other').all()))
+ def test_in_keeps_value_ordering(self):
+ query = Article.objects.filter(slug__in=['a%d' % i for i in range(1, 8)]).values('pk').query
+ self.assertIn(' IN (a1, a2, a3, a4, a5, a6, a7) ', str(query))
+
def test_error_messages(self):
# Programming errors are pointed out with nice error messages
with self.assertRaisesMessage(