1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- from datetime import datetime
- from django.core.exceptions import FieldError
- from django.db.models import CharField, F, Q
- from django.db.models.expressions import SimpleCol
- from django.db.models.fields.related_lookups import RelatedIsNull
- from django.db.models.functions import Lower
- from django.db.models.lookups import Exact, GreaterThan, IsNull, LessThan
- from django.db.models.sql.query import Query
- from django.db.models.sql.where import OR
- from django.test import TestCase
- from .models import Author, Item, ObjectC, Ranking
- class TestQuery(TestCase):
- def test_simple_query(self):
- query = Query(Author)
- where = query.build_where(Q(num__gt=2))
- lookup = where.children[0]
- self.assertIsInstance(lookup, GreaterThan)
- self.assertEqual(lookup.rhs, 2)
- self.assertEqual(lookup.lhs.target, Author._meta.get_field('num'))
- def test_complex_query(self):
- query = Query(Author)
- where = query.build_where(Q(num__gt=2) | Q(num__lt=0))
- self.assertEqual(where.connector, OR)
- lookup = where.children[0]
- self.assertIsInstance(lookup, GreaterThan)
- self.assertEqual(lookup.rhs, 2)
- self.assertEqual(lookup.lhs.target, Author._meta.get_field('num'))
- lookup = where.children[1]
- self.assertIsInstance(lookup, LessThan)
- self.assertEqual(lookup.rhs, 0)
- self.assertEqual(lookup.lhs.target, Author._meta.get_field('num'))
- def test_multiple_fields(self):
- query = Query(Item)
- where = query.build_where(Q(modified__gt=F('created')))
- lookup = where.children[0]
- self.assertIsInstance(lookup, GreaterThan)
- self.assertIsInstance(lookup.rhs, SimpleCol)
- self.assertIsInstance(lookup.lhs, SimpleCol)
- self.assertEqual(lookup.rhs.target, Item._meta.get_field('created'))
- self.assertEqual(lookup.lhs.target, Item._meta.get_field('modified'))
- 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_negated_nullable(self):
- query = Query(Item)
- where = query.build_where(~Q(modified__lt=datetime(2017, 1, 1)))
- self.assertTrue(where.negated)
- lookup = where.children[0]
- self.assertIsInstance(lookup, LessThan)
- self.assertEqual(lookup.lhs.target, Item._meta.get_field('modified'))
- lookup = where.children[1]
- self.assertIsInstance(lookup, IsNull)
- self.assertEqual(lookup.lhs.target, Item._meta.get_field('modified'))
- def test_foreign_key(self):
- query = Query(Item)
- msg = 'Joined field references are not permitted in this query'
- with self.assertRaisesMessage(FieldError, msg):
- query.build_where(Q(creator__num__gt=2))
- def test_foreign_key_f(self):
- query = Query(Ranking)
- with self.assertRaises(FieldError):
- query.build_where(Q(rank__gt=F('author__num')))
- def test_foreign_key_exclusive(self):
- query = Query(ObjectC)
- where = query.build_where(Q(objecta=None) | Q(objectb=None))
- a_isnull = where.children[0]
- self.assertIsInstance(a_isnull, RelatedIsNull)
- self.assertIsInstance(a_isnull.lhs, SimpleCol)
- self.assertEqual(a_isnull.lhs.target, ObjectC._meta.get_field('objecta'))
- b_isnull = where.children[1]
- self.assertIsInstance(b_isnull, RelatedIsNull)
- self.assertIsInstance(b_isnull.lhs, SimpleCol)
- self.assertEqual(b_isnull.lhs.target, ObjectC._meta.get_field('objectb'))
|