1
0
mirror of https://github.com/django/django.git synced 2024-12-22 17:16:24 +00:00

Fixed #33216 -- Simpilified deconstructed paths for some expressions.

This commit is contained in:
Allen Jonathan David 2021-12-06 14:17:22 +05:30 committed by Mariusz Felisiak
parent 96e7ff5e9f
commit 28c98d4113
3 changed files with 35 additions and 2 deletions

View File

@ -651,6 +651,7 @@ class OuterRef(F):
return self return self
@deconstructible(path='django.db.models.Func')
class Func(SQLiteNumericMixin, Expression): class Func(SQLiteNumericMixin, Expression):
"""An SQL function call.""" """An SQL function call."""
function = None function = None
@ -731,6 +732,7 @@ class Func(SQLiteNumericMixin, Expression):
return copy return copy
@deconstructible(path='django.db.models.Value')
class Value(SQLiteNumericMixin, Expression): class Value(SQLiteNumericMixin, Expression):
"""Represent a wrapped value as a node within an expression.""" """Represent a wrapped value as a node within an expression."""
# Provide a default value for `for_save` in order to allow unresolved # Provide a default value for `for_save` in order to allow unresolved
@ -953,6 +955,7 @@ class OrderByList(Func):
return super().as_sql(*args, **kwargs) return super().as_sql(*args, **kwargs)
@deconstructible(path='django.db.models.ExpressionWrapper')
class ExpressionWrapper(SQLiteNumericMixin, Expression): class ExpressionWrapper(SQLiteNumericMixin, Expression):
""" """
An expression that can wrap another expression so that it can provide An expression that can wrap another expression so that it can provide
@ -985,6 +988,7 @@ class ExpressionWrapper(SQLiteNumericMixin, Expression):
return "{}({})".format(self.__class__.__name__, self.expression) return "{}({})".format(self.__class__.__name__, self.expression)
@deconstructible(path='django.db.models.When')
class When(Expression): class When(Expression):
template = 'WHEN %(condition)s THEN %(result)s' template = 'WHEN %(condition)s THEN %(result)s'
# This isn't a complete conditional expression, must be used in Case(). # This isn't a complete conditional expression, must be used in Case().
@ -1052,6 +1056,7 @@ class When(Expression):
return cols return cols
@deconstructible(path='django.db.models.Case')
class Case(SQLiteNumericMixin, Expression): class Case(SQLiteNumericMixin, Expression):
""" """
An SQL searched CASE expression: An SQL searched CASE expression:
@ -1225,6 +1230,7 @@ class Exists(Subquery):
return sql, params return sql, params
@deconstructible(path='django.db.models.OrderBy')
class OrderBy(Expression): class OrderBy(Expression):
template = '%(expression)s %(ordering)s' template = '%(expression)s %(ordering)s'
conditional = False conditional = False

View File

@ -1763,14 +1763,14 @@ class ValueTests(TestCase):
def test_deconstruct(self): def test_deconstruct(self):
value = Value('name') value = Value('name')
path, args, kwargs = value.deconstruct() path, args, kwargs = value.deconstruct()
self.assertEqual(path, 'django.db.models.expressions.Value') self.assertEqual(path, 'django.db.models.Value')
self.assertEqual(args, (value.value,)) self.assertEqual(args, (value.value,))
self.assertEqual(kwargs, {}) self.assertEqual(kwargs, {})
def test_deconstruct_output_field(self): def test_deconstruct_output_field(self):
value = Value('name', output_field=CharField()) value = Value('name', output_field=CharField())
path, args, kwargs = value.deconstruct() path, args, kwargs = value.deconstruct()
self.assertEqual(path, 'django.db.models.expressions.Value') self.assertEqual(path, 'django.db.models.Value')
self.assertEqual(args, (value.value,)) self.assertEqual(args, (value.value,))
self.assertEqual(len(kwargs), 1) self.assertEqual(len(kwargs), 1)
self.assertEqual(kwargs['output_field'].deconstruct(), CharField().deconstruct()) self.assertEqual(kwargs['output_field'].deconstruct(), CharField().deconstruct())

View File

@ -607,6 +607,33 @@ class WriterTests(SimpleTestCase):
with self.assertRaisesMessage(ValueError, "Could not find object EmailValidator2 in django.core.validators."): with self.assertRaisesMessage(ValueError, "Could not find object EmailValidator2 in django.core.validators."):
MigrationWriter.serialize(validator) MigrationWriter.serialize(validator)
def test_serialize_complex_func_index(self):
index = models.Index(
models.Func('rating', function='ABS'),
models.Case(
models.When(name='special', then=models.Value('X')),
default=models.Value('other'),
),
models.ExpressionWrapper(
models.F('pages'),
output_field=models.IntegerField(),
),
models.OrderBy(models.F('name').desc()),
name='complex_func_index',
)
string, imports = MigrationWriter.serialize(index)
self.assertEqual(
string,
"models.Index(models.Func('rating', function='ABS'), "
"models.Case(models.When(name='special', then=models.Value('X')), "
"default=models.Value('other')), "
"models.ExpressionWrapper("
"models.F('pages'), output_field=models.IntegerField()), "
"models.OrderBy(models.OrderBy(models.F('name'), descending=True)), "
"name='complex_func_index')"
)
self.assertEqual(imports, {'from django.db import models'})
def test_serialize_empty_nonempty_tuple(self): def test_serialize_empty_nonempty_tuple(self):
""" """
Ticket #22679: makemigrations generates invalid code for (an empty Ticket #22679: makemigrations generates invalid code for (an empty