mirror of
https://github.com/django/django.git
synced 2025-08-03 10:34:04 +00:00
Fixed #29725 -- Removed unnecessary join in QuerySet.count() and exists() on a many-to-many relation.
This commit is contained in:
parent
f2e2a1bd4b
commit
1299421cad
3 changed files with 80 additions and 3 deletions
|
@ -1,7 +1,13 @@
|
|||
from django.db import transaction
|
||||
from django.test import TestCase
|
||||
from unittest import mock
|
||||
|
||||
from .models import Article, InheritedArticleA, InheritedArticleB, Publication
|
||||
from django.db import connection, transaction
|
||||
from django.test import TestCase, skipUnlessDBFeature
|
||||
from django.test.utils import CaptureQueriesContext
|
||||
|
||||
from .models import (
|
||||
Article, InheritedArticleA, InheritedArticleB, NullablePublicationThrough,
|
||||
NullableTargetArticle, Publication,
|
||||
)
|
||||
|
||||
|
||||
class ManyToManyTests(TestCase):
|
||||
|
@ -554,3 +560,37 @@ class ManyToManyTests(TestCase):
|
|||
]
|
||||
)
|
||||
self.assertQuerysetEqual(b.publications.all(), ['<Publication: Science Weekly>'])
|
||||
|
||||
|
||||
class ManyToManyQueryTests(TestCase):
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
cls.article = Article.objects.create(headline='Django lets you build Web apps easily')
|
||||
cls.nullable_target_article = NullableTargetArticle.objects.create(headline='The python is good')
|
||||
NullablePublicationThrough.objects.create(article=cls.nullable_target_article, publication=None)
|
||||
|
||||
@skipUnlessDBFeature('supports_foreign_keys')
|
||||
def test_count_join_optimization(self):
|
||||
with CaptureQueriesContext(connection) as query:
|
||||
self.article.publications.count()
|
||||
self.assertNotIn('JOIN', query[0]['sql'])
|
||||
self.assertEqual(self.nullable_target_article.publications.count(), 0)
|
||||
|
||||
def test_count_join_optimization_disabled(self):
|
||||
with mock.patch.object(connection.features, 'supports_foreign_keys', False), \
|
||||
CaptureQueriesContext(connection) as query:
|
||||
self.article.publications.count()
|
||||
self.assertIn('JOIN', query[0]['sql'])
|
||||
|
||||
@skipUnlessDBFeature('supports_foreign_keys')
|
||||
def test_exists_join_optimization(self):
|
||||
with CaptureQueriesContext(connection) as query:
|
||||
self.article.publications.exists()
|
||||
self.assertNotIn('JOIN', query[0]['sql'])
|
||||
self.assertIs(self.nullable_target_article.publications.exists(), False)
|
||||
|
||||
def test_exists_join_optimization_disabled(self):
|
||||
with mock.patch.object(connection.features, 'supports_foreign_keys', False), \
|
||||
CaptureQueriesContext(connection) as query:
|
||||
self.article.publications.exists()
|
||||
self.assertIn('JOIN', query[0]['sql'])
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue