def test_transform(self): try: CharField.register_lookup(Length) Author.objects.create(name='John Smith', alias='smithj') Author.objects.create(name='Rhonda') authors = Author.objects.filter(name__length__gt=7) self.assertQuerysetEqual(authors.order_by('name'), ['John Smith'], lambda a: a.name) finally: CharField._unregister_lookup(Length)
def test_transform(self): try: CharField.register_lookup(Ord) authors = Author.objects.annotate(first_initial=Left('name', 1)) self.assertCountEqual(authors.filter(first_initial__ord=ord('J')), [self.john]) self.assertCountEqual(authors.exclude(first_initial__ord=ord('J')), [self.elena, self.rhonda]) finally: CharField._unregister_lookup(Ord)
def test_transform(self): try: CharField.register_lookup(Upper) Author.objects.create(name='John Smith', alias='smithj') Author.objects.create(name='Rhonda') authors = Author.objects.filter(name__upper__exact='JOHN SMITH') self.assertQuerysetEqual(authors.order_by('name'), [ 'John Smith', ], lambda a: a.name) finally: CharField._unregister_lookup(Upper)
def test_basic(self): Author.objects.create(name='John', alias='xyz') tests = ( (Repeat('name', 0), ''), (Repeat('name', 2), 'JohnJohn'), (Repeat('name', Length('alias'), output_field=CharField()), 'JohnJohnJohn'), (Repeat(Value('x'), 3, output_field=CharField()), 'xxx'), ) for function, repeated_text in tests: with self.subTest(function=function): authors = Author.objects.annotate(repeated_text=function) self.assertQuerysetEqual(authors, [repeated_text], lambda a: a.repeated_text, ordered=False)
def test_transform(self): query = Query(Author) CharField.register_lookup(Lower, 'lower') try: where = query.build_where(~Q(name__lower='foo')) finally: CharField._unregister_lookup(Lower, 'lower') lookup = where.children[0] self.assertIsInstance(lookup, Exact) self.assertIsInstance(lookup.lhs, Lower) self.assertIsInstance(lookup.lhs.lhs, SimpleCol) self.assertEqual(lookup.lhs.lhs.target, Author._meta.get_field('name'))
def test_func_transform_bilateral(self): class UpperBilateral(Upper): bilateral = True try: CharField.register_lookup(UpperBilateral) Author.objects.create(name='John Smith', alias='smithj') Author.objects.create(name='Rhonda') authors = Author.objects.filter(name__upper__exact='john smith') self.assertQuerysetEqual(authors.order_by('name'), [ 'John Smith', ], lambda a: a.name) finally: CharField._unregister_lookup(UpperBilateral)
def test_trim_transform(self): Author.objects.create(name=' John ') Author.objects.create(name='Rhonda') tests = ( (LTrim, 'John '), (RTrim, ' John'), (Trim, 'John'), ) for transform, trimmed_name in tests: with self.subTest(transform=transform): try: CharField.register_lookup(transform) authors = Author.objects.filter( **{'name__%s' % transform.lookup_name: trimmed_name}) self.assertQuerysetEqual(authors, [' John '], lambda a: a.name) finally: CharField._unregister_lookup(transform)
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()) authors = Author.objects.annotate(name_part=substr) self.assertQuerysetEqual( authors.order_by('name'), ['HN SM', 'HONDA'], lambda a: a.name_part )
def ready(self): # Connections may already exist before we are called. for conn in connections.all(): if conn.vendor == 'postgresql': conn.introspection.data_types_reverse.update({ 3802: 'djmodels.contrib.postgres.fields.JSONField', 3904: 'djmodels.contrib.postgres.fields.IntegerRangeField', 3906: 'djmodels.contrib.postgres.fields.FloatRangeField', 3910: 'djmodels.contrib.postgres.fields.DateTimeRangeField', 3912: 'djmodels.contrib.postgres.fields.DateRangeField', 3926: 'djmodels.contrib.postgres.fields.BigIntegerRangeField', }) if conn.connection is not None: register_type_handlers(conn) connection_created.connect(register_type_handlers) CharField.register_lookup(Unaccent) TextField.register_lookup(Unaccent) CharField.register_lookup(SearchLookup) TextField.register_lookup(SearchLookup) CharField.register_lookup(TrigramSimilar) TextField.register_lookup(TrigramSimilar)
def test_many(self): Author.objects.create(name='Jayden') Author.objects.create(name='John Smith', alias='smithj', goes_by='John') Author.objects.create(name='Margaret', goes_by='Maggie') Author.objects.create(name='Rhonda', alias='adnohR') authors = Author.objects.annotate( joined=Concat('name', V(' ('), 'goes_by', V(')'), output_field=CharField()), ) self.assertQuerysetEqual( authors.order_by('name'), [ 'Jayden ()', 'John Smith (John)', 'Margaret (Maggie)', 'Rhonda ()', ], lambda a: a.joined )
def test_custom_functions_can_ref_other_functions(self): Company(name='Apple', motto=None, ticker_name='APPL', description='Beautiful Devices').save() Company(name='Django Software Foundation', motto=None, ticker_name=None, description=None).save() Company(name='Google', motto='Do No Evil', ticker_name='GOOG', description='Internet Company').save() Company(name='Yahoo', motto=None, ticker_name=None, description='Internet Company').save() class Lower(Func): function = 'LOWER' qs = Company.objects.annotate(tagline=Func( F('motto'), F('ticker_name'), F('description'), Value('No Tag'), function='COALESCE', )).annotate(tagline_lower=Lower(F( 'tagline'), output_field=CharField())).order_by('name') # LOWER function supported by: # oracle, postgres, mysql, sqlite, sqlserver self.assertQuerysetEqual( qs, [('Apple', 'APPL'.lower()), ('Django Software Foundation', 'No Tag'.lower()), ('Google', 'Do No Evil'.lower()), ('Yahoo', 'Internet Company'.lower())], lambda c: (c.name, c.tagline_lower))
def test_expressions(self): authors = Author.objects.annotate( name_part=Right('name', Value(3), output_field=CharField())) self.assertQuerysetEqual(authors.order_by('name'), ['ith', 'nda'], lambda a: a.name_part)
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())) self.assertQuerysetEqual( authors.order_by('alias'), [' ♥♣♠', ' Rhonda'], lambda a: a.filled, )