Thursday, October 28, 2010

How do I filter/exclude custom queryset fields created by .extra()?

I have something like this:

class Node(Model):
widgets = ForeignKey(Widget)

And I want to retrieve all nodes that have >0 widgets. I have
an .extra() query like this:

nodes = Node.objects.all().extra(
select={
'num_widgets': 'SELECT COUNT(*) FROM appname_node_widgets
WHERE appname_node_widgets.node_id = appname_node.id',
}
)

This works fine, since I can now do this:

print nodes[0].num_widgets

But I can't filter or exclude on this field. I try this:

nodes = nodes.exclude(num_widgets=0)

Gives a "FieldError: Cannot resolve keyword 'num_widgets' into
field." I understand that the fields created by the .extra() call are
not "real" fields attached to the model, but they are fields attached
to the QuerySet. Is there a way to use fields created with .extra()
in subsequent filter/exclude calls?

My next guess is to drop down to custom SQL and write the whole query
out by hand, but I thought I'd check to see if I'm doing something
wrong here. I thought I remembered being able to use .extra() fields
in later .filter() statements, but I might be imagining that.

Any thoughts? Thanks!

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to django-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.

No comments:

Post a Comment