diff options
| author | Anssi Kääriäinen <akaariai@gmail.com> | 2013-11-02 22:35:45 +0200 |
|---|---|---|
| committer | Anssi Kääriäinen <akaariai@gmail.com> | 2013-11-02 22:35:45 +0200 |
| commit | bec0b2a8c637ba2dc3745ad0c1e68ccc6c2f78bd (patch) | |
| tree | 6798d30312529877b04af916154322c1ac26b0fc /tests | |
| parent | 7548aa8ffd46eb6e0f73730d1b2eb515ba581f95 (diff) | |
Fixed #14511 -- bug in .exclude() query
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/queries/models.py | 19 | ||||
| -rw-r--r-- | tests/queries/tests.py | 39 |
2 files changed, 56 insertions, 2 deletions
diff --git a/tests/queries/models.py b/tests/queries/models.py index c0be285b12..53b716abd1 100644 --- a/tests/queries/models.py +++ b/tests/queries/models.py @@ -544,3 +544,22 @@ class Ticket21203Parent(models.Model): class Ticket21203Child(models.Model): childid = models.AutoField(primary_key=True) parent = models.ForeignKey(Ticket21203Parent) + + +class Person(models.Model): + name = models.CharField(max_length=128) + + +@python_2_unicode_compatible +class Company(models.Model): + name = models.CharField(max_length=128) + employees = models.ManyToManyField(Person, related_name='employers', through='Employment') + + def __str__(self): + return self.name + + +class Employment(models.Model): + employer = models.ForeignKey(Company) + employee = models.ForeignKey(Person) + title = models.CharField(max_length=128) diff --git a/tests/queries/tests.py b/tests/queries/tests.py index 74c73297ed..8a70d1ffe7 100644 --- a/tests/queries/tests.py +++ b/tests/queries/tests.py @@ -25,7 +25,8 @@ from .models import ( ModelA, ModelB, ModelC, ModelD, Responsibility, Job, JobResponsibilities, BaseA, FK1, Identifier, Program, Channel, Page, Paragraph, Chapter, Book, MyObject, Order, OrderItem, SharedConnection, Task, Staff, StaffUser, - CategoryRelationship, Ticket21203Parent, Ticket21203Child) + CategoryRelationship, Ticket21203Parent, Ticket21203Child, Person, + Company, Employment) class BaseQuerysetTest(TestCase): def assertValueQuerysetEqual(self, qs, values): @@ -2352,7 +2353,7 @@ class DefaultValuesInsertTest(TestCase): except TypeError: self.fail("Creation of an instance of a model with only the PK field shouldn't error out after bulk insert refactoring (#17056)") -class ExcludeTest(TestCase): +class ExcludeTests(TestCase): def setUp(self): f1 = Food.objects.create(name='apples') Food.objects.create(name='oranges') @@ -2375,6 +2376,37 @@ class ExcludeTest(TestCase): Responsibility.objects.exclude(jobs__name='Manager'), ['<Responsibility: Programming>']) + def test_ticket14511(self): + alex = Person.objects.get_or_create(name='Alex')[0] + jane = Person.objects.get_or_create(name='Jane')[0] + + oracle = Company.objects.get_or_create(name='Oracle')[0] + google = Company.objects.get_or_create(name='Google')[0] + microsoft = Company.objects.get_or_create(name='Microsoft')[0] + intel = Company.objects.get_or_create(name='Intel')[0] + + def employ(employer, employee, title): + Employment.objects.get_or_create(employee=employee, employer=employer, title=title) + + employ(oracle, alex, 'Engineer') + employ(oracle, alex, 'Developer') + employ(google, alex, 'Engineer') + employ(google, alex, 'Manager') + employ(microsoft, alex, 'Manager') + employ(intel, alex, 'Manager') + + employ(microsoft, jane, 'Developer') + employ(intel, jane, 'Manager') + + alex_tech_employers = alex.employers.filter( + employment__title__in=('Engineer', 'Developer')).distinct().order_by('name') + self.assertQuerysetEqual(alex_tech_employers, [google, oracle], lambda x: x) + + alex_nontech_employers = alex.employers.exclude( + employment__title__in=('Engineer', 'Developer')).distinct().order_by('name') + self.assertQuerysetEqual(alex_nontech_employers, [google, intel, microsoft], lambda x: x) + + class ExcludeTest17600(TestCase): """ Some regressiontests for ticket #17600. Some of these likely duplicate @@ -3135,3 +3167,6 @@ class ValuesJoinPromotionTests(TestCase): def test_non_nullable_fk_not_promoted(self): qs = ObjectB.objects.values('objecta__name') self.assertTrue(' INNER JOIN ' in str(qs.query)) + + +class ExcludeJoinTest(TestCase): |
