Given your view code above, what would the template code look like to return something like this:
object | tags -------+---------- obj1 | food, meat obj2 | food, meat obj3 | food obj4 | food, cake obj5 | food, cake obj6 | food, vegetable obj7 | garden, vegetable On Aug 6, 1:46 pm, Tim Chase <[EMAIL PROTECTED]> wrote: > > Now I want to get all objects, which have set tag "food" *and* *have > > not* set tag "cake". > > > This get all objects with tag="food" set (obj1..obj5): > > > Obj.objects.filter(tags__in=[Tags.objects.filter(name='food')]) > > > This get all objects, which haven't set tag "cake" (obj1..obj3, obj6..obj7): > > > Obj.objects.exclude(tags__in=[Tags.objects.filter(name='cake')]) > > > When I try to combine DB queries together, I don't get what I expect > > (obj1..obj3, obj6): > > Django's ORM doesn't handle this sort of thing very gracefully, > so it requires dropping down to a little SQL with .extra() calls. > > Something like > > Obj.objects.extra(where=[""" > app_model.id IN ( > SELECT model_id > FROM app_tags > WHERE name = ? > ) > """, ['food']).extra(where[""" > app_model.id NOT IN ( > SELECT model_id > FROM app_tags > WHERE name = ? > ) > """, ['cake']) > > it's ugly and hackish, but when things scale up, this is the only > way to get it to work (I've got several hundred thousand records > in my app that does logic like this, so I need all the > speed-boost I can get) > > if your tagsets return small collections, you could use > sets...something like > > food = set(t.obj_id for t in Tags.objects.filter(name='food')) > cake = set(t.obj_id for t in Tags.objects.filter(name='cake')) > Obj.objects.filter(id__in=food - cake) > > (that last line might need to be "tuple(food-cake)") > > but as noted, this doesn't scale well once "food" or "cake" tags > thousands of things (or maybe even hundreds of things). > > -tim --~--~---------~--~----~------------~-------~--~----~ 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 [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---