Ticket #4002: models.py

File models.py, 2.5 KB (added by exogen@…, 16 years ago)

extra / filter shortcoming demo

Line 
1from django.db import models
2from datetime import datetime
3
4class Blog(models.Model):
5    name = models.CharField(maxlength=100)
6    tagline = models.TextField()
7
8    def __str__(self):
9        return "%s (%s)" % (self.name, self.entry_set.count())
10
11    class Meta:
12        db_table = 'test_blog'
13
14class Author(models.Model):
15    name = models.CharField(maxlength=50)
16    email = models.URLField()
17
18    def __str__(self):
19        return self.name
20   
21    class Meta:
22        db_table = 'test_author'
23
24class Entry(models.Model):
25    blog = models.ForeignKey(Blog)
26    headline = models.CharField(maxlength=255)
27    body_text = models.TextField()
28    pub_date = models.DateTimeField(default=datetime.now)
29    authors = models.ManyToManyField(Author)
30
31    def __str__(self):
32        return self.headline
33   
34    class Meta:
35        db_table = 'test_entry'
36
37def test_extra_filter():
38    print "Clearing Blog and Entry rows..."
39    for blog in Blog.objects.all():
40        for entry in blog.entry_set.all():
41            entry.delete()
42        blog.delete()
43    print "Populating database..."
44    mine = Blog(name="My blog", tagline="It's mine")
45    his = Blog(name="His blog", tagline="It's his")
46    hers = Blog(name="Her blog", tagline="It's hers")
47    mine.save(), his.save(), hers.save()
48    Entry(blog=mine, headline="My first").save()
49    Entry(blog=his, headline="His first").save()
50    Entry(blog=his, headline="His second").save()
51    Entry(blog=his, headline="His third").save()
52    Entry(blog=hers, headline="Her first").save()
53    Entry(blog=hers, headline="Her second").save()
54   
55    print "My blog has 1 entry, His blog has 3 entries, and Her blog has 2 entries."
56   
57    print "Now I'll order blogs by how many entries they have..."
58    print "(The expected result is His, Hers, Mine.)"
59   
60    print Blog.objects.extra(select={
61        'entry_count': """SELECT COUNT(*) FROM test_entry
62                          WHERE test_entry.blog_id = test_blog.id"""
63        }).order_by('-entry_count')
64   
65    print "It worked -- clearly 'entry_count' is available in the SQL since ORDER BY saw it."
66   
67    print "Now I'll filter blogs that have 2 entries:"
68    print "(The expected result is Hers.)"
69   
70    try:
71        print Blog.objects.extra(select={
72            'entry_count': """SELECT COUNT(*) FROM test_entry
73                              WHERE test_entry.blog_id = test_blog.id"""
74            }).filter(entry_count=2)
75    except TypeError:
76        print "But it raised an error!"
77        raise
78   
Back to Top