﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
11347	isnull=False returns incorrect results for reverse relations	mrts	nobody	"== Preliminaries ==

Assume the following model:
{{{
from django.db import models

class A(models.Model):
    name = models.CharField(max_length=10)

    def __unicode__(self):
        return self.name

class B(models.Model):
    a = models.ForeignKey(A)
    name = models.CharField(max_length=10)

    def __unicode__(self):
        return self.name
}}}

and the following sample data:
{{{
>>> from reverserelation.models import A, B
>>> a1 = A.objects.create(name='first')
>>> a2 = A.objects.create(name='second')
>>> b1 = B.objects.create(a=a1, name='x')
>>> b2 = B.objects.create(a=a1, name='y')
>>> b3 = B.objects.create(a=a1, name='z')
}}}

== The problem ==

Filtering `A` objects that have no associated `B`s works as expected:
{{{
>>> A.objects.filter(b__isnull=True)
[<A: second>]
}}}

The opposite, filtering `A` objects that have at least one `B` that refers to it, doesn't.

'''Expected:'''
{{{
>>> A.objects.filter(b__isnull=False)
[<A: first>]
}}}

'''Got:'''
{{{
>>> A.objects.filter(b__isnull=False)
[<A: first>, <A: first>, <A: first>]
}}}

Why is this happening:
{{{
>>> A.objects.filter(b__isnull=False).query.as_sql()
('SELECT ""reverserelation_a"".""id"", ""reverserelation_a"".""name""
 FROM ""reverserelation_a""
INNER JOIN ""reverserelation_b"" ON (""reverserelation_a"".""id"" = ""reverserelation_b"".""a_id"")
WHERE ""reverserelation_b"".""id"" IS NOT NULL', ())
}}}

A `SELECT DISTINCT` is required in this case."		closed	Database layer (models, ORM)	dev		wontfix			Unreviewed	0	0	0	0	0	0
