1. from django.db.models import Value
    
  2. from django.db.models.functions import StrIndex
    
  3. from django.test import TestCase
    
  4. from django.utils import timezone
    
  5. 
    
  6. from ..models import Article, Author
    
  7. 
    
  8. 
    
  9. class StrIndexTests(TestCase):
    
  10.     def test_annotate_charfield(self):
    
  11.         Author.objects.create(name="George. R. R. Martin")
    
  12.         Author.objects.create(name="J. R. R. Tolkien")
    
  13.         Author.objects.create(name="Terry Pratchett")
    
  14.         authors = Author.objects.annotate(fullstop=StrIndex("name", Value("R.")))
    
  15.         self.assertQuerysetEqual(
    
  16.             authors.order_by("name"), [9, 4, 0], lambda a: a.fullstop
    
  17.         )
    
  18. 
    
  19.     def test_annotate_textfield(self):
    
  20.         Article.objects.create(
    
  21.             title="How to Django",
    
  22.             text="This is about How to Django.",
    
  23.             written=timezone.now(),
    
  24.         )
    
  25.         Article.objects.create(
    
  26.             title="How to Tango",
    
  27.             text="Won't find anything here.",
    
  28.             written=timezone.now(),
    
  29.         )
    
  30.         articles = Article.objects.annotate(title_pos=StrIndex("text", "title"))
    
  31.         self.assertQuerysetEqual(
    
  32.             articles.order_by("title"), [15, 0], lambda a: a.title_pos
    
  33.         )
    
  34. 
    
  35.     def test_order_by(self):
    
  36.         Author.objects.create(name="Terry Pratchett")
    
  37.         Author.objects.create(name="J. R. R. Tolkien")
    
  38.         Author.objects.create(name="George. R. R. Martin")
    
  39.         self.assertQuerysetEqual(
    
  40.             Author.objects.order_by(StrIndex("name", Value("R.")).asc()),
    
  41.             [
    
  42.                 "Terry Pratchett",
    
  43.                 "J. R. R. Tolkien",
    
  44.                 "George. R. R. Martin",
    
  45.             ],
    
  46.             lambda a: a.name,
    
  47.         )
    
  48.         self.assertQuerysetEqual(
    
  49.             Author.objects.order_by(StrIndex("name", Value("R.")).desc()),
    
  50.             [
    
  51.                 "George. R. R. Martin",
    
  52.                 "J. R. R. Tolkien",
    
  53.                 "Terry Pratchett",
    
  54.             ],
    
  55.             lambda a: a.name,
    
  56.         )
    
  57. 
    
  58.     def test_unicode_values(self):
    
  59.         Author.objects.create(name="ツリー")
    
  60.         Author.objects.create(name="皇帝")
    
  61.         Author.objects.create(name="皇帝 ツリー")
    
  62.         authors = Author.objects.annotate(sb=StrIndex("name", Value("")))
    
  63.         self.assertQuerysetEqual(authors.order_by("name"), [2, 0, 5], lambda a: a.sb)
    
  64. 
    
  65.     def test_filtering(self):
    
  66.         Author.objects.create(name="George. R. R. Martin")
    
  67.         Author.objects.create(name="Terry Pratchett")
    
  68.         self.assertQuerysetEqual(
    
  69.             Author.objects.annotate(middle_name=StrIndex("name", Value("R."))).filter(
    
  70.                 middle_name__gt=0
    
  71.             ),
    
  72.             ["George. R. R. Martin"],
    
  73.             lambda a: a.name,
    
  74.         )