On 16 kesä, 21:41, rt <rtoma...@gmail.com> wrote: > Hi, > > I am having a hard time with Q objects based on subqueries. It's a > part of a linguistic corpus analysis query builder (hence Q objects as > this is how I parse and translate arbitrary queries into Django) -- > the user can search 'posts' that meet complex criteria. Anyway, it's > all working fine and dandy with the exception of querying post tags > (there is a many-to-many relationship between posts and tags). > > A simplified version of my models.py: > --- BEGIN --- > class Tag(models.Model): > label = models.CharField(max_length=255) > > class Post(models.Model): > tags = models.ManyToManyField(Tag, through='TagsForPost') > > class TagsForPost(models.Model): > tag = models.ForeignKey(Tag) > post = models.ForeignKey(Post) > --- END --- > > The query parser iterates over the query expression and for every > criterion (=smallest subexpression) it adds a Q object. Let's say I > have this query: > 'Tag' 'is' "tagA" > AND > 'Tag' 'is' "tagB" > which should yield all posts that are tagged with both tagA and tagB. >
Haven't tested this but this particular query should be doable with: Post.objects.filter(tags__label__in=['tagA', 'tagB']) The thing inside parentheses could of course be represented with a Q object. For example I have a test db with bit different models: class Person(models.Model): name = models.CharField(max_length=200) class Group(models.Model): name = models.CharField(max_length=200) persons = models.ManyToManyField(Person, through='Through') class Through(models.Model): person = models.ForeignKey(Person) group = models.ForeignKey(Group) The query Groups.objects.filter(persons__name__in=['anssi']) gives this SQL: 'SELECT "autocomplete_group"."id", "autocomplete_group"."name" FROM "autocomplete_group" INNER JOIN "autocomplete_through" ON ("autocomplete_group"."id" = "autocomplete_through"."group_id") INNER JOIN "autocomplete_person" ON ("autocomplete_through"."person_id" = "autocomplete_person"."id") WHERE "autocomplete_person"."name" IN (anssi)' -- Anssi > So I feel I need something that will generate IN operator in SQL, with > the condition set being the result of a subquery fetching all tags for > a post. This seems to be handled nicely by > Django:http://docs.djangoproject.com/en/dev/ref/models/querysets/#in > However, since I am looking for posts, I need to cross-reference the > post in the inner query with the post in the outer query (on the SQL > level at least). I guess matching posts by primary key is the way to > go here. However, > I can't quite wrap my mind around the Django syntax here. Can anyone > help me with getting the proper Q object that will do the trick? > > Let's assume that for every iteration the tag name (string) is held in > a variable called 'value'. As an example, for conditions for searching > for posts starting with a given text I do: > result = Q(body_anonymized__istartswith=value) > ('body' was originally a part of Post above in models.py) > > Thanks in advance! -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@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.