duh, i forgot to say that i had 477 registered domain in the database and 0 hosts before i run this code :-)
On 7 Mai, 15:40, Riccardo Pelizzi <r.peli...@gmail.com> wrote: > Sorry for the delay. hosts__isnull works! > But i can confirm exclude doesn't: > > h = Host.objects.create(ip="0.0.0.0") > d = RegisteredDomain.objects.all()[0] > d.hosts.add(h) > RegisteredDomain.objects.count() > --> 477L (total) > RegisteredDomain.objects.filter(hosts=None).count() > --> 476L (good!) > RegisteredDomain.objects.exclude(hosts=None).count() > --> 0 (not so good :-/) > RegisteredDomain.objects.filter(hosts__isnull=False).count() > --> 1L (good!) > > I will paste you both models to be sure: > > class Host(TimeStampedModel): > ip = models.IPAddressField(unique=True) > > class RegisteredDomain(TimeStampedModel): > domain = models.CharField(max_length=255, unique=True) > spam_time = models.DateTimeField(null=True) > hosts = models.ManyToManyField(Host, > related_name="registered_domains") > random = models.BooleanField(null=True) > > Is this a bug or i just didn't get how models work? :-) > > Riccardo > > On 4 Mai, 21:22, Malcolm Tredinnick <malc...@pointy-stick.com> wrote: > > > On Mon, 2009-05-04 at 09:18 -0700, Riccardo Pelizzi wrote: > > > Hello, > > > > I have a model which looks kinda like this: > > > > class Host(model): > > > ip = IPAddressField() > > > > class Domain(model): > > > hosts = ManyToManyField(Host) > > > > If i want to get all the domains without hosts: > > > Domain.objects.filter(hosts=None) > > > works. > > > > Later on in my script i need to get the opposite, all the domains > > > having one or more hosts associated. using exclude instead of filter > > > with the same condition doesn't work as expected (at least as I > > > expected :-P), it just returns an empty queryset. Is there a way to > > > formulate thequeryusing the django api? or should i use custom sql? > > > That should work properly. It works for me using exactly your models > > with a few different Host/Domain combinations. > > > The SQL we currently generate for Domain.objects.exclude(hosts=None) is > > a little inefficient, but it's not fundamentally incorrect. It just uses > > a couple more tables than it needs to be because the "NULL" case can > > take advantage of one particular extra optimisation that isn't in the > > code yet. I'm surprised it isn't returning the correct result. > > > Another to get the same answer, which generates simpler SQL but is > > potentially a little less efficient on the database side is > > > Domain.objects.filter(hosts__isnull=False).distinct() > > > That's essentially the only case where Django has a "not" filter > > available: you can actually filter for "not NULL". The distinct() call > > there is important, as for many-to-many fields, you would otherwise get > > back one domain object for every host (so repetitions for domains with > > multiple hosts), not just the set of domains that have at least one > > host. > > > In any case, I suspect there's something else going on in your > > particular case, as the SQL generated should be pulling back the results > > you're after and it works with a small example using your models. If you > > can use those models, as pasted, to generate an incorrect result, what > > is the smallest amount of data (Host & Domain objects) you need to > > create to demonstrate the problem. That would be interesting to see. > > > Regards, > > Malcolm --~--~---------~--~----~------------~-------~--~----~ 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+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---