1. from django.db.models import F, Value
    
  2. from django.db.models.functions import Concat, Replace
    
  3. from django.test import TestCase
    
  4. 
    
  5. from ..models import Author
    
  6. 
    
  7. 
    
  8. class ReplaceTests(TestCase):
    
  9.     @classmethod
    
  10.     def setUpTestData(cls):
    
  11.         Author.objects.create(name="George R. R. Martin")
    
  12.         Author.objects.create(name="J. R. R. Tolkien")
    
  13. 
    
  14.     def test_replace_with_empty_string(self):
    
  15.         qs = Author.objects.annotate(
    
  16.             without_middlename=Replace(F("name"), Value("R. R. "), Value("")),
    
  17.         )
    
  18.         self.assertQuerysetEqual(
    
  19.             qs,
    
  20.             [
    
  21.                 ("George R. R. Martin", "George Martin"),
    
  22.                 ("J. R. R. Tolkien", "J. Tolkien"),
    
  23.             ],
    
  24.             transform=lambda x: (x.name, x.without_middlename),
    
  25.             ordered=False,
    
  26.         )
    
  27. 
    
  28.     def test_case_sensitive(self):
    
  29.         qs = Author.objects.annotate(
    
  30.             same_name=Replace(F("name"), Value("r. r."), Value(""))
    
  31.         )
    
  32.         self.assertQuerysetEqual(
    
  33.             qs,
    
  34.             [
    
  35.                 ("George R. R. Martin", "George R. R. Martin"),
    
  36.                 ("J. R. R. Tolkien", "J. R. R. Tolkien"),
    
  37.             ],
    
  38.             transform=lambda x: (x.name, x.same_name),
    
  39.             ordered=False,
    
  40.         )
    
  41. 
    
  42.     def test_replace_expression(self):
    
  43.         qs = Author.objects.annotate(
    
  44.             same_name=Replace(
    
  45.                 Concat(Value("Author: "), F("name")), Value("Author: "), Value("")
    
  46.             ),
    
  47.         )
    
  48.         self.assertQuerysetEqual(
    
  49.             qs,
    
  50.             [
    
  51.                 ("George R. R. Martin", "George R. R. Martin"),
    
  52.                 ("J. R. R. Tolkien", "J. R. R. Tolkien"),
    
  53.             ],
    
  54.             transform=lambda x: (x.name, x.same_name),
    
  55.             ordered=False,
    
  56.         )
    
  57. 
    
  58.     def test_update(self):
    
  59.         Author.objects.update(
    
  60.             name=Replace(F("name"), Value("R. R. "), Value("")),
    
  61.         )
    
  62.         self.assertQuerysetEqual(
    
  63.             Author.objects.all(),
    
  64.             [
    
  65.                 ("George Martin"),
    
  66.                 ("J. Tolkien"),
    
  67.             ],
    
  68.             transform=lambda x: x.name,
    
  69.             ordered=False,
    
  70.         )
    
  71. 
    
  72.     def test_replace_with_default_arg(self):
    
  73.         # The default replacement is an empty string.
    
  74.         qs = Author.objects.annotate(same_name=Replace(F("name"), Value("R. R. ")))
    
  75.         self.assertQuerysetEqual(
    
  76.             qs,
    
  77.             [
    
  78.                 ("George R. R. Martin", "George Martin"),
    
  79.                 ("J. R. R. Tolkien", "J. Tolkien"),
    
  80.             ],
    
  81.             transform=lambda x: (x.name, x.same_name),
    
  82.             ordered=False,
    
  83.         )