mirror of
				https://github.com/django/django.git
				synced 2025-10-29 08:36:09 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			75 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from django.db.models import Value
 | |
| from django.db.models.functions import StrIndex
 | |
| from django.test import TestCase
 | |
| from django.utils import timezone
 | |
| 
 | |
| from ..models import Article, Author
 | |
| 
 | |
| 
 | |
| class StrIndexTests(TestCase):
 | |
|     def test_annotate_charfield(self):
 | |
|         Author.objects.create(name="George. R. R. Martin")
 | |
|         Author.objects.create(name="J. R. R. Tolkien")
 | |
|         Author.objects.create(name="Terry Pratchett")
 | |
|         authors = Author.objects.annotate(fullstop=StrIndex("name", Value("R.")))
 | |
|         self.assertQuerysetEqual(
 | |
|             authors.order_by("name"), [9, 4, 0], lambda a: a.fullstop
 | |
|         )
 | |
| 
 | |
|     def test_annotate_textfield(self):
 | |
|         Article.objects.create(
 | |
|             title="How to Django",
 | |
|             text="This is about How to Django.",
 | |
|             written=timezone.now(),
 | |
|         )
 | |
|         Article.objects.create(
 | |
|             title="How to Tango",
 | |
|             text="Won't find anything here.",
 | |
|             written=timezone.now(),
 | |
|         )
 | |
|         articles = Article.objects.annotate(title_pos=StrIndex("text", "title"))
 | |
|         self.assertQuerysetEqual(
 | |
|             articles.order_by("title"), [15, 0], lambda a: a.title_pos
 | |
|         )
 | |
| 
 | |
|     def test_order_by(self):
 | |
|         Author.objects.create(name="Terry Pratchett")
 | |
|         Author.objects.create(name="J. R. R. Tolkien")
 | |
|         Author.objects.create(name="George. R. R. Martin")
 | |
|         self.assertQuerysetEqual(
 | |
|             Author.objects.order_by(StrIndex("name", Value("R.")).asc()),
 | |
|             [
 | |
|                 "Terry Pratchett",
 | |
|                 "J. R. R. Tolkien",
 | |
|                 "George. R. R. Martin",
 | |
|             ],
 | |
|             lambda a: a.name,
 | |
|         )
 | |
|         self.assertQuerysetEqual(
 | |
|             Author.objects.order_by(StrIndex("name", Value("R.")).desc()),
 | |
|             [
 | |
|                 "George. R. R. Martin",
 | |
|                 "J. R. R. Tolkien",
 | |
|                 "Terry Pratchett",
 | |
|             ],
 | |
|             lambda a: a.name,
 | |
|         )
 | |
| 
 | |
|     def test_unicode_values(self):
 | |
|         Author.objects.create(name="ツリー")
 | |
|         Author.objects.create(name="皇帝")
 | |
|         Author.objects.create(name="皇帝 ツリー")
 | |
|         authors = Author.objects.annotate(sb=StrIndex("name", Value("リ")))
 | |
|         self.assertQuerysetEqual(authors.order_by("name"), [2, 0, 5], lambda a: a.sb)
 | |
| 
 | |
|     def test_filtering(self):
 | |
|         Author.objects.create(name="George. R. R. Martin")
 | |
|         Author.objects.create(name="Terry Pratchett")
 | |
|         self.assertQuerysetEqual(
 | |
|             Author.objects.annotate(middle_name=StrIndex("name", Value("R."))).filter(
 | |
|                 middle_name__gt=0
 | |
|             ),
 | |
|             ["George. R. R. Martin"],
 | |
|             lambda a: a.name,
 | |
|         )
 |