Django QuerySets, how to express EXISTS ... IN ...

54 views
Skip to first unread message

Dean De Leo

unread,
Feb 8, 2015, 11:30:25 AM2/8/15
to django...@googlegroups.com
Hello,
I am trying to find how to filter the entries of my blog by a set of
tags, using the Django models.
In particular there are two relations:
Blog (id, title, content)
Tag ( name, blog_id )
with Tag.blog_id foreign key of Blog.id
I want to select all blog entries that contain a certain set of tags.
For instance, I would express the query in SQL as:
SELECT * FROM blog_blog b WHERE EXISTS ( SELECT 1 FROM blog_tag t WHERE
t.blog_id = b.id AND lower(t.name) IN ('tag1', 'tag2', 'tag3') );

How to represent the same query with the Django QuerySets ?

Thanks,
Dean De Leo


Neto

unread,
Feb 8, 2015, 11:55:33 AM2/8/15
to django...@googlegroups.com, dean...@gmx.com
mytag = Tag.objects.get(id=1)
mytag.blog_set.all()

Dean De Leo

unread,
Feb 8, 2015, 12:43:33 PM2/8/15
to django...@googlegroups.com
Hi, thanks for the reply.
I still get the error:
Exception Type: AttributeError
Exception Value:
'Tag' object has no attribute 'blog_set'

if rawtags:
    taglist = rawtags.split('/');
    t = Tag.objects.get(name = "Alpha");
    blogentries = t.blog_set.all()
else:
    blogentries = Blog.objects.all();


My Models:
# My blog
class Blog(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField(max_length=10000);
    dateAdd = models.DateTimeField(auto_now_add=True, null=False);
    dateEdit = models.DateTimeField(auto_now=True);

    class Meta:
        ordering = ['-id']


class Tag(models.Model):
    name = models.CharField(max_length=255, null=False)
    blog = models.ForeignKey('Blog', null=False)

    class Meta:
        unique_together = [("name", "blog",)]
        ordering = ["name"]


Am I mispelling something?

Thanks,
Dean De Leo

Neto

unread,
Feb 9, 2015, 12:36:16 AM2/9/15
to django...@googlegroups.com, dean...@gmx.com
Your model is incorrect. Each blog has only one tag? So you have only one result per tag. 
Tag.objects.get(name = "Alpha").blog
Reply all
Reply to author
Forward
0 new messages