Model 'Child' is inherited from 'Parent', trying to filter to get only Child results with Parent.objects.filter(...)

413 views
Skip to first unread message

robin

unread,
May 31, 2011, 4:53:26 AM5/31/11
to Django users
Example code:

class Parent(models.Model):
name = models.CharField(max_length='20',blank=True)

class Child(Parent):
pass

I want to get the result of Child.objects.all() but I DO NOT want to
use Child.
I want to use Parent instead, which I tried to do with:

Parent.objects.filter(child__isnull=False)

Which doesn't work and gives the result of Product.objects.all()
instead.
However If I do the following, it WORKS:

Parent.objects.filter(child__name__isnull=False)

Another way, if I insist on using
Parent.objects.filter(child__isnull=False), is to change the Child
model to the following:

class Child(models.Model):
parent = models.OneToOneField(Parent)

Then Parent.objects.filter(child__isnull=False) would WORK

The problem with the 2 solutions above is that filtering with
child__name__isnull looks hackish, and I don't want to change my Child
model to use OneToOneField.

So is there a better way?

Thanks,
Robin

robin

unread,
May 31, 2011, 11:23:15 PM5/31/11
to Django users
Shall I report the inability of using
Parent.objects.filter(child__isnull=False) as a bug?

Matías Aguirre

unread,
May 31, 2011, 11:40:05 PM5/31/11
to django-users
This worked on on Django 1.2.5:

Parent.objects.exclude(child__isnull=True)

Does it work for you?

Excerpts from robin's message of Tue May 31 05:53:26 -0300 2011:

--
Matías Aguirre <matias...@gmail.com>

robin

unread,
Jun 1, 2011, 5:07:50 AM6/1/11
to Django users
Yes that works, thank you.
I've submitted a bug report here https://code.djangoproject.com/ticket/16135
The bug is that Parent.objects.filter(child__isnull=False) is not
giving the result I expect.
> Matías Aguirre <matiasagui...@gmail.com>
Reply all
Reply to author
Forward
0 new messages