Example #1
0
 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)
Example #2
0
 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)
Example #3
0
 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)
Example #4
0
 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)
Example #5
0
 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'))
Example #6
0
    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)
Example #7
0
 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)
Example #8
0
 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
     )
Example #9
0
 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)
Example #10
0
 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
     )
Example #11
0
    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))
Example #12
0
 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)
Example #13
0
 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,
     )