Refs #30446 -- Defined default output_field of text database functions.

This prevented the default behavior of
BaseExpression._resolve_output_field from error'ing out when such
functions accepted both expressions from mixed types
(e.g. SubStr(CharField, IntegerField, IntegerField)).
This commit is contained in:
Simon Charette 2020-06-16 10:01:34 +02:00 committed by Mariusz Felisiak
parent 0d6d4e78b1
commit ea3beb4f5a
6 changed files with 16 additions and 12 deletions

View file

@ -1,4 +1,4 @@
from django.db.models import CharField, Value
from django.db.models import IntegerField, Value
from django.db.models.functions import Left, Lower
from django.test import TestCase
@ -23,5 +23,5 @@ class LeftTests(TestCase):
Author.objects.annotate(raises=Left('name', 0))
def test_expressions(self):
authors = Author.objects.annotate(name_part=Left('name', Value(3), output_field=CharField()))
authors = Author.objects.annotate(name_part=Left('name', Value(3, output_field=IntegerField())))
self.assertQuerysetEqual(authors.order_by('name'), ['Joh', 'Rho'], lambda a: a.name_part)

View file

@ -1,5 +1,5 @@
from django.db import connection
from django.db.models import CharField, Value
from django.db.models import Value
from django.db.models.functions import Length, LPad, RPad
from django.test import TestCase
@ -42,7 +42,7 @@ class PadTests(TestCase):
def test_combined_with_length(self):
Author.objects.create(name='Rhonda', alias='john_smith')
Author.objects.create(name='♥♣♠', alias='bytes')
authors = Author.objects.annotate(filled=LPad('name', Length('alias'), output_field=CharField()))
authors = Author.objects.annotate(filled=LPad('name', Length('alias')))
self.assertQuerysetEqual(
authors.order_by('alias'),
[' ♥♣♠', ' Rhonda'],

View file

@ -1,5 +1,5 @@
from django.db import connection
from django.db.models import CharField, Value
from django.db.models import Value
from django.db.models.functions import Length, Repeat
from django.test import TestCase
@ -13,8 +13,8 @@ class RepeatTests(TestCase):
tests = (
(Repeat('name', 0), ''),
(Repeat('name', 2), 'JohnJohn'),
(Repeat('name', Length('alias'), output_field=CharField()), 'JohnJohnJohn'),
(Repeat(Value('x'), 3, output_field=CharField()), 'xxx'),
(Repeat('name', Length('alias')), 'JohnJohnJohn'),
(Repeat(Value('x'), 3), 'xxx'),
(Repeat('name', None), none_value),
(Repeat('goes_by', 1), none_value),
)

View file

@ -1,4 +1,4 @@
from django.db.models import CharField, Value
from django.db.models import IntegerField, Value
from django.db.models.functions import Lower, Right
from django.test import TestCase
@ -23,5 +23,5 @@ class RightTests(TestCase):
Author.objects.annotate(raises=Right('name', 0))
def test_expressions(self):
authors = Author.objects.annotate(name_part=Right('name', Value(3), output_field=CharField()))
authors = Author.objects.annotate(name_part=Right('name', Value(3, output_field=IntegerField())))
self.assertQuerysetEqual(authors.order_by('name'), ['ith', 'nda'], lambda a: a.name_part)

View file

@ -1,4 +1,4 @@
from django.db.models import CharField, Value as V
from django.db.models import Value as V
from django.db.models.functions import Lower, StrIndex, Substr, Upper
from django.test import TestCase
@ -45,7 +45,7 @@ class SubstrTests(TestCase):
def test_expressions(self):
Author.objects.create(name='John Smith', alias='smithj')
Author.objects.create(name='Rhonda')
substr = Substr(Upper('name'), StrIndex('name', V('h')), 5, output_field=CharField())
substr = Substr(Upper('name'), StrIndex('name', V('h')), 5)
authors = Author.objects.annotate(name_part=substr)
self.assertQuerysetEqual(
authors.order_by('name'), ['HN SM', 'HONDA'],