diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-02-28 12:57:10 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-02-28 12:57:10 +0000 |
| commit | 33a0862215edeaa7848e625cd0b0777fb4885de1 (patch) | |
| tree | cfc665e6c9de42142409f9409b1e46938e2b5b65 /tests | |
| parent | 0588dee34cde61f408e06766d95c2a3a882883bd (diff) | |
queryset-refactor: Fixed exclude() filtering for the various N-to-many relations.
This means we can now do nested SQL queries (since we need nested queries to
get the right answer). It requires poking directly at the Query class. Might
add support for this through QuerySets later.
git-svn-id: http://code.djangoproject.com/svn/django/branches/queryset-refactor@7170 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/modeltests/many_to_many/models.py | 5 | ||||
| -rw-r--r-- | tests/regressiontests/queries/models.py | 19 |
2 files changed, 13 insertions, 11 deletions
diff --git a/tests/modeltests/many_to_many/models.py b/tests/modeltests/many_to_many/models.py index 198c95c4d5..e09fd825f8 100644 --- a/tests/modeltests/many_to_many/models.py +++ b/tests/modeltests/many_to_many/models.py @@ -126,6 +126,11 @@ __test__ = {'API_TESTS':""" >>> Publication.objects.filter(article__in=[a1,a2]).distinct() [<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>, <Publication: The Python Journal>] +# Excluding a related item works as you would expect, too (although the SQL +# involved is a little complex). +>>> Article.objects.exclude(publications=p2) +[<Article: Django lets you build Web apps easily>] + # If we delete a Publication, its Articles won't be able to access it. >>> p1.delete() >>> Publication.objects.all() diff --git a/tests/regressiontests/queries/models.py b/tests/regressiontests/queries/models.py index c95026a54e..50c002d14d 100644 --- a/tests/regressiontests/queries/models.py +++ b/tests/regressiontests/queries/models.py @@ -322,22 +322,19 @@ Bug #5324 >>> Author.objects.exclude(item__name='one').distinct().order_by('name') [<Author: a2>, <Author: a3>, <Author: a4>] + +# Excluding across a m2m relation when there is more than one related object +# associated was problematic. +>>> Item.objects.exclude(tags__name='t1').order_by('name') +[<Item: four>, <Item: three>] +>>> Item.objects.exclude(tags__name='t1').exclude(tags__name='t4') +[<Item: three>] + # Excluding from a relation that cannot be NULL should not use outer joins. >>> query = Item.objects.exclude(creator__in=[a1, a2]).query >>> query.LOUTER not in [x[2][2] for x in query.alias_map.values()] True -# When only one of the joins is nullable (here, the Author -> Item join), we -# should only get outer joins after that point (one, in this case). We also -# show that three tables (so, two joins) are involved. ->>> qs = Report.objects.exclude(creator__item__name='one') ->>> list(qs) -[<Report: r2>] ->>> len([x[2][2] for x in qs.query.alias_map.values() if x[2][2] == query.LOUTER]) -1 ->>> len(qs.query.alias_map) -3 - Similarly, when one of the joins cannot possibly, ever, involve NULL values (Author -> ExtraInfo, in the following), it should never be promoted to a left outer join. So hte following query should only involve one "left outer" join (Author -> Item is 0-to-many). >>> qs = Author.objects.filter(id=a1.id).filter(Q(extra__note=n1)|Q(item__note=n3)) >>> len([x[2][2] for x in qs.query.alias_map.values() if x[2][2] == query.LOUTER]) |
