11. Django
Leading web application framework
Lots of people coming to Python via Django today
Model-View-Controller
Command line management scripts
It’s own Rails-like ORM
Based on the Active Record pattern
12. Active Record Pattern
Database table is wrapped in a class
Each class instance is a row in the table
Relationships expressd as foreign key constraints
14. from django.db import models
class User(models.Model):
flickr_id = models.TextField()
name = models.TextField()
def __unicode__(self):
return self.name
class Group(models.Model):
flickr_id = models.TextField()
name = models.TextField()
throttle_count = models.IntegerField()
throttle_mode = models.TextField()
throttle_remaining = models.IntegerField()
def __unicode__(self):
return self.name
15. class Photo(models.Model):
flickr_id = models.IntegerField()
title = models.TextField()
user = models.ForeignKey(User)
groups = models.ManyToManyField(Group)
url = models.URLField()
pub_date = models.DateTimeField()
def __unicode__(self):
return self.title
16. from curator.models import Photo
from datetime import datetime
Photo.objects.all()
Photo.objects.filter(title__contains='PyCon')
Photo.objects.filter(title__contains='PyCon').exclude(
pub_date__lte=datetime(2009,4,1))
Photo.objects.filter(title__contains='PyCon').exclude(
pub_date__lte=datetime(2009,4,1))[2:4]
17. from django.contrib import admin
class PhotoAdmin(admin.ModelAdmin):
pass
class GroupAdmin(admin.ModelAdmin):
pass
class UserAdmin(admin.ModelAdmin):
pass
admin.site.register(Group, GroupAdmin)
admin.site.register(Photo, PhotoAdmin)
admin.site.register(User, UserAdmin)
18. def load_from_flickr(request):
api = API()
# 51035696189@N01
twl, created = User.objects.get_or_create(
flickr_id = '51035696189@N01',
name = 'Ted Leung'
)
if created:
twl.save()
photos = api.list_user_info(
'http://www.flickr.com/photos/twleung')
20. # do pools
for pool in pools:
new_pool, created=Group.objects.get_or_create(
flickr_id = pool[0],
name = pool[1],
throttle_count = pool[2],
throttle_mode = pool[3],
throttle_remaining = pool[4]
)
new_photo.groups.add(new_pool)
if created:
new_pool.save()
26. ../bin/django startmigration curator --initial
Creating migrations directory at '/Users/twl/work/
mysql-2009/django/flickrmgr/curator/migrations'...
Creating __init__.py in '/Users/twl/work/mysql-2009/
django/flickrmgr/curator/migrations'...
+ Added model 'curator.Photo'
+ Added model 'curator.Group'
+ Added model 'curator.User'
+ Added field 'curator.Photo.groups'
Created 0001_initial.py.
27. class Photo(models.Model):
flickr_id = models.IntegerField()
title = models.TextField()
user = models.ForeignKey(User)
groups = models.ManyToManyField(Group)
url = models.URLField()
pub_date = models.DateTimeField()
visible = models.BooleanField()
29. from south.db import db
from django.db import models
from curator.models import *
class Migration:
def forwards(self, orm):
# Adding field 'Photo.visible'
db.add_column('curator_photo', 'visible',
models.BooleanField())
def backwards(self, orm):
# Deleting field 'Photo.visible'
db.delete_column('curator_photo', 'visible')
30. SQLObject
ORM using Active Record pattern
Tight coupling to Python classes
Used in TurboGears 1
45. metadata.create_all(engine)
conn = engine.connect()
s = select([users_table])
result = conn.execute(s)
for row in result:
print row
s = select([photos_table],
photos_table.c.title.contains('PyCon'))
for row in conn.execute(s):
print row
46. ins = users.insert().values(name='Thomas Hawk',
flickr_id='000')
result = conn.execute(ins)
update =
users.update().where(
users.c.name=='Thomas Hawk'
).values(
flickr_id='51035555243@N01'))
result = conn.execute(update)
49. Other Low Level SQL features
Unions and other Set operations
Scalar Selects
Correlated Subqueries
Ordering, Grouping, Offsetting
Correlated Updates
53. from sqlalchemy.orm import mapper, sessionmaker
engine = create_engine(
'mysql://twl:pass@localhost/sqlobject')
54. Session = sessionmaker(bind = engine)
session = Session()
mapper(User, users_table, properties = {
'photos' : relation(Photo, backref='user')
})
mapper(Group, groups_table, properties = {
'photos' : relation(Photo,
secondary=flickr_group_photo,
backref='groups')
})
mapper(Photo, photos_table)
for u in session.query(User):
print u
for g in session.query(Group):
print g
for p in session.query(Photo):
print p
58. class Photo(Base):
__tablename__ = 'photo'
id = Column(Integer, primary_key=True)
flickr_id = Column(Text)
title = Column(Text)
user_id = Column(Integer,ForeignKey('user.id'))
user = relation(User,
backref=backref('photos', order_by=id))
groups = relation('Group',
secondary=flickr_group_photo,
backref=backref('photos'))
url = Column(Text)
pub_date = Column(DateTime)
def __repr__(self):
return quot;<Photo('%s','%s','%s','%s')>quot; % (
self.id,
self.flickr_id,
self.title,
self.url
)
59. Session = sessionmaker(bind = engine)
session = Session()
for u in session.query(User):
print u
for g in session.query(Group):
print g
for p in session.query(Photo):
print p
64. class Photo(Entity):
using_options(tablename = 'photo')
flickr_id = Field(Text)
title = Field(Text)
url = Column(Text)
pub_date = Column(DateTime)
groups = ManyToMany('Group')
user = ManyToOne('User')
def __repr__(self):
return quot;<Photo('%s','%s','%s','%s')>quot; % (
self.id,
self.flickr_id,
self.title,
self.url
)
65. engine = create_engine(
'mysql://twl:pass@localhost/sqlobject', echo=True)
Session = sessionmaker(bind = engine)
session = Session()
metadata = MetaData()
metadata.bind='mysql://twl:pass@localhost/sqlobject'
metadata.bind.echo = True
setup_all()
for u in session.query(User):
print u
for g in session.query(Group):
print g
for p in session.query(Photo):
print print