1. from django.core.exceptions import FieldError
    
  2. from django.test import TestCase
    
  3. 
    
  4. from .models.default_related_name import Author, Book, Editor
    
  5. 
    
  6. 
    
  7. class DefaultRelatedNameTests(TestCase):
    
  8.     @classmethod
    
  9.     def setUpTestData(cls):
    
  10.         cls.author = Author.objects.create(first_name="Dave", last_name="Loper")
    
  11.         cls.editor = Editor.objects.create(
    
  12.             name="Test Editions", bestselling_author=cls.author
    
  13.         )
    
  14.         cls.book = Book.objects.create(title="Test Book", editor=cls.editor)
    
  15.         cls.book.authors.add(cls.author)
    
  16. 
    
  17.     def test_no_default_related_name(self):
    
  18.         self.assertEqual(list(self.author.editor_set.all()), [self.editor])
    
  19. 
    
  20.     def test_default_related_name(self):
    
  21.         self.assertEqual(list(self.author.books.all()), [self.book])
    
  22. 
    
  23.     def test_default_related_name_in_queryset_lookup(self):
    
  24.         self.assertEqual(Author.objects.get(books=self.book), self.author)
    
  25. 
    
  26.     def test_model_name_not_available_in_queryset_lookup(self):
    
  27.         msg = "Cannot resolve keyword 'book' into field."
    
  28.         with self.assertRaisesMessage(FieldError, msg):
    
  29.             Author.objects.get(book=self.book)
    
  30. 
    
  31.     def test_related_name_overrides_default_related_name(self):
    
  32.         self.assertEqual(list(self.editor.edited_books.all()), [self.book])
    
  33. 
    
  34.     def test_inheritance(self):
    
  35.         # model_options is the name of the application for this test.
    
  36.         self.assertEqual(list(self.book.model_options_bookstores.all()), [])
    
  37. 
    
  38.     def test_inheritance_with_overridden_default_related_name(self):
    
  39.         self.assertEqual(list(self.book.editor_stores.all()), [])