mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	Rewrapped long docstrings and block comments to 79 characters + newline using script from https://github.com/medmunds/autofix-w505.
		
			
				
	
	
		
			68 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from django.db.models import Q
 | |
| from django.test import TestCase
 | |
| 
 | |
| from .models import Comment, Forum, Item, Post, PropertyValue, SystemDetails, SystemInfo
 | |
| 
 | |
| 
 | |
| class NullFkTests(TestCase):
 | |
|     def test_null_fk(self):
 | |
|         d = SystemDetails.objects.create(details="First details")
 | |
|         s = SystemInfo.objects.create(system_name="First forum", system_details=d)
 | |
|         f = Forum.objects.create(system_info=s, forum_name="First forum")
 | |
|         p = Post.objects.create(forum=f, title="First Post")
 | |
|         c1 = Comment.objects.create(post=p, comment_text="My first comment")
 | |
|         c2 = Comment.objects.create(comment_text="My second comment")
 | |
| 
 | |
|         # Starting from comment, make sure that a .select_related(...) with a
 | |
|         # specified set of fields will properly LEFT JOIN multiple levels of
 | |
|         # NULLs (and the things that come after the NULLs, or else data that
 | |
|         # should exist won't). Regression test for #7369.
 | |
|         c = Comment.objects.select_related().get(id=c1.id)
 | |
|         self.assertEqual(c.post, p)
 | |
|         self.assertIsNone(Comment.objects.select_related().get(id=c2.id).post)
 | |
| 
 | |
|         self.assertQuerySetEqual(
 | |
|             Comment.objects.select_related("post__forum__system_info").all(),
 | |
|             [
 | |
|                 (c1.id, "My first comment", "<Post: First Post>"),
 | |
|                 (c2.id, "My second comment", "None"),
 | |
|             ],
 | |
|             transform=lambda c: (c.id, c.comment_text, repr(c.post)),
 | |
|         )
 | |
| 
 | |
|         # Regression test for #7530, #7716.
 | |
|         self.assertIsNone(
 | |
|             Comment.objects.select_related("post").filter(post__isnull=True)[0].post
 | |
|         )
 | |
| 
 | |
|         self.assertQuerySetEqual(
 | |
|             Comment.objects.select_related("post__forum__system_info__system_details"),
 | |
|             [
 | |
|                 (c1.id, "My first comment", "<Post: First Post>"),
 | |
|                 (c2.id, "My second comment", "None"),
 | |
|             ],
 | |
|             transform=lambda c: (c.id, c.comment_text, repr(c.post)),
 | |
|         )
 | |
| 
 | |
|     def test_combine_isnull(self):
 | |
|         item = Item.objects.create(title="Some Item")
 | |
|         pv = PropertyValue.objects.create(label="Some Value")
 | |
|         item.props.create(key="a", value=pv)
 | |
|         item.props.create(key="b")  # value=NULL
 | |
|         q1 = Q(props__key="a", props__value=pv)
 | |
|         q2 = Q(props__key="b", props__value__isnull=True)
 | |
| 
 | |
|         # Each of these individually should return the item.
 | |
|         self.assertEqual(Item.objects.get(q1), item)
 | |
|         self.assertEqual(Item.objects.get(q2), item)
 | |
| 
 | |
|         # Logically, qs1 and qs2, and qs3 and qs4 should be the same.
 | |
|         qs1 = Item.objects.filter(q1) & Item.objects.filter(q2)
 | |
|         qs2 = Item.objects.filter(q2) & Item.objects.filter(q1)
 | |
|         qs3 = Item.objects.filter(q1) | Item.objects.filter(q2)
 | |
|         qs4 = Item.objects.filter(q2) | Item.objects.filter(q1)
 | |
| 
 | |
|         # Regression test for #15823.
 | |
|         self.assertEqual(list(qs1), list(qs2))
 | |
|         self.assertEqual(list(qs3), list(qs4))
 |