An Overview of Models in Django

Post on 15-Apr-2017

269 views 0 download

Transcript of An Overview of Models in Django

An Overview of Models in Django

Michael Auritt

• Director of Media Production at CorpU

• Self-taught programmer

• Twitter: @mauritt

Django

djangoproject.com

Django

• Models• Views• Templates

Django

• Models - Manage our data

• Views - Query the data

• Template - Present the data

Django

• Models - Manage our data

• Views - Query the data

• Template - Present the data

Models

• The single definitive source of information about your website data

• Uses Django’s Object-relational Mapper

• Each model maps to a single database table

• Each field maps to a column within that table

Talent Management The Happiness Advantage

CorpU Promo

My Video PortfolioVideos | About | Contact

Supply Chain Management

http://www.myvideoportfolio.com/videos

Supply Chain Management

My Video PortfolioVideos| About | Contact

http://www.djangodjunction.com/djangos/01

This course explores end-to-end supply chain management. This video takes a look at the main elements of a modern supply chain and…

Supply Chain Management

My Video PortfolioVideos| About | Contact

http://www.djangodjunction.com/djangos/01

TITLE

DESCRIPTION

Embed

This course explores end-to-end supply chain management. This video takes a look at the main elements of a modern supply chain and…

models.py

from django.db import models

class Video(models.Model):

title = models.CharField(max_length = 200) description = models.TextField() embed_key = models.IntegerField() date_completed = models.DateField()

id(primary key) title descriptio

n embed_key date_completed

Video

id title description embed_key date_completed

1 Ursa Motors In this video… 679210 2014-10-01

2 Sea BoxSea Box is a

company that…

933750 2015-03-15

3Critical

ThinkingIn Critical Thinking… 876025 2014-09-23

4 CorpU Promo CorpU’s platform… 867302 2015-02-05

video

models.py

from django.db import models

class Video(models.Model):

title = models.CharField(max_length = 200) description = models.TextField() embed_key = models.IntegerField() date_completed = models.DateField()

djangoproject.com

Documentation

Model Field Reference

models.py

from django.db import models

class Video(models.Model):

title = models.CharField(max_length = 200) description = models.TextField() embed_key = models.IntegerField() date_completed = models.DateField()

title = models.CharField(max_length = 200)

hidden = models.BooleanField(default = True)

slug = models.SlugField(unique = True)

Validators

• validate_slug

• EmailValidator

• URLValidator

Validators

(validate = [email_validator])

models.pyfrom django.db import modelsfrom django.core.exceptions import ValidationError

def validate_embed(value): valid_embed = (checks embed at vimeo.com) if not valid_embed: raise ValidationError(‘That embed code does not exist at vimeo.com’)

class Video(models.Model): embed = integerField(validators = [validate_embed])

Field ChoicesGENRE_CHOICES = ( (‘DOC’, ‘Documentary’ ), (‘PRO’, ‘Promo’), (‘NAR’,’Narrative’),)

genre = models.CharField( max_length = 3, choices = GENRE_CHOICES)

models.pyfrom django.db import models

class Video(models.Model):

title = models.CharField(max_length = 200) description = models.TextField() embed_key = models.IntegerField() date_completed = models.DateField() hidden = models.BooleanField(default = True) slug = models.SlugField(unique = True)

Relationships

• Many to One• Many to Many• One to One

Many to One

One row of a database table relates to many rows of another.

title … client

… Client: 01

… Client: 02

… Client: 01

… Client: 03

… Client: 01

… Client: 02

id name

website …

01 … …

02 … …

03 …

VideoClient

Many to One

Many to One

class Client(models.Model): name = models.CharField(unique = True) website = models.URLField()

class Video(models.Model): client = models.ForeignKey(Client)

Many to Many

Many rows of a database table relate to many rows of another.

… role

… role: Camera Op, Editor, Producer

… role: Camera Op, Editor

… role: Producer

… role: Editor

name …

Camera Op …

Editor …

Producer …

VideoRole

Many to Many

Many to Many

class Role(models.Model): name = models.CharField(unique = True)

class Video(models.Model): role = models.ManyToManyField(Role)

One to One

One row of a database table relates to one row of another.

… file

… File: 1

… File: 2

… File 3

… FIle 4

VideoOne to One

id path

1

2

3

4

File

One to One

class File(models.Model): drive = models.CharField() path = models.FilePathField()

class Video(models.Model): file = models.OneToOneField(File)

$ python manage.py makemigrations

Migrations operations = [ migrations.CreateModel( name='Video', fields=[ ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), ('title', models.CharField(max_length=200)), ('description', models.TextField()), ('embed', models.TextField()), ('company', models.ForeignKey(to='videos.Company')), ('roles', models.ManyToManyField(to='videos.Role')),

$ python manage.py migrate

Migrations

operations = [ migrations.AlterField( model_name='company', name=‘slug’, field=models.SlugField(unique=True),

Migration Issues

• Adding new fields without a default

• Adding new unique fields

• Changing relationships

QueriesReturning Many Objects

• Video.objects.all()

• Video.obects.filter(client = ‘MasterCard’)

• Video.objects.all().order_by(‘date_created’)

QueriesReturning Many Objects

MC_Videos = Video.obects.filter(client = ‘MasterCard’)

MC_Ascending_Order = MC_videos.order_by(‘title’)

MC_Descending_Order = MC_videos.order_by(‘-title’)

QueriesReturning Many Objects

MC_videos = Video.obects.filter(client = ‘MasterCard’)

MC_videos = MC_videos.order_by(‘date_created’)

MC_videos = MC_videos.exclude(Role = ‘Producer’)

Field Lookupsfield__lookuptype=value

.filter(title__startswith=‘G’)

.filter(date_completed__gte=datetime(2015,01,01))

.filter(title__contains = ‘Supply Chain’)

QueriesReturning Single Objects

• Video.objects.get(pk = 1)

• Video.objects.get(title = ‘My Best Video’)

Queries

• QuerySet API Reference in Django Docs

• QuerySets are lazy

• QuerySets are faster than using Python

Queries>>>from video.models import Video

>>> v = Video.objects.get(pk = 1)

>>> print(v)

<Video: Video object>

Model Methodsfrom django.db import models

class Video(models.Model):

title = models.CharField(max_length = 200) def __str__(self): return self.title

Queries>>>from video.models import Video

>>> v = Video.objects.get(pk = 1)

>>> print(v)

<Video: Talent Management>

Model Methodsclass Role(models.Model): name = models.CharField(unique = True)

class Video(models.Model): def is_full_stack(self): full_stack = True for role in Role.objects.all(): if role not in self.role.all(): full_stack = False return full_stack

Model Methods>>>from video.models import Video

>>> v = Video.get(pk = 1)

>>> v.is_full_stack()

True

Views.py

def detail(request, slug): try: video = Video.Objects.get(slug = slug) except video.DoesNotExist: raise Http404() else: context = {‘video’: video} return render(request, ‘videos/detail.html’, context)

Model Manager

video.objects.all()

Model Manager

video.objects.all()

models.Manger

Thanks

Further Reading

• djangoproject.com

• Two Scoops of Django (TwoScoopsPress.com)

• Lightweight Django (O’Reilly)