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:
parent
96e7ff5e9f
commit
28c98d4113
@ -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
|
||||||
|
@ -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())
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user