relationships in django orm

46
Relationships in Django ORM @starwilly

Upload: willy-liu

Post on 21-Jan-2018

419 views

Category:

Travel


0 download

TRANSCRIPT

Page 1: Relationships in Django ORM

Relationships in Django ORM@starwilly

Page 2: Relationships in Django ORM

Outline

• Single model ( Django girls tutorial )

• Relationship

• 1. many-to-one ( )

• 2. many-to-many (Tag)

• What does it looks like in database

• How to define relationship

• Traverse / query / create / delete relation

Page 3: Relationships in Django ORM

A Simple Django Model

Page 4: Relationships in Django ORM

CRUD (Create, Read, Update, Delete)

Post.objects.create(title='My First Trip', content=‘ ?', location=' ')

Post.objects.all()

[<Post: My First Trip>, <Post: My Second Trip>, <Post: Django >]

Post.objects.filter(pk__gt=1)

[<Post: My Second Trip>, <Post: Django >]

Page 5: Relationships in Django ORM

CRUD

posts = Post.objects.filter(pk__lt=3)

[<Post: My First Trip>, <Post: My Second Trip>]

posts.update(location=‘ ')

2

posts.delete()

Page 6: Relationships in Django ORM

Model : Table

id title content photo location created_at1 …2 …

Page 7: Relationships in Django ORM

Relationship

• many-to-one

• many-to-many

Page 8: Relationships in Django ORM

Many-to-one Relationship

Page 9: Relationships in Django ORM

• 1.

• 2.

Alan:

Bob:

Cindy:

Page 10: Relationships in Django ORM

Model

Page 11: Relationships in Django ORM

Many-to-one Relationship

PostComment

1m

Page 12: Relationships in Django ORM

ForeignKey

• (many-to-one)

ForeignKey(othermodel, **options)

Page 13: Relationships in Django ORM

Use Foreign Key to Define m:1

Comment Post

Page 14: Relationships in Django ORM

id author content1 Alan …2 Bob …3 Cindy …4 Denny5

id title content1 …2 …

Page 15: Relationships in Django ORM

id post_id author content1 1 Alan …2 1 Bob …3 1 Cindy …4 2 Denny5 2 Alan

id title content1 …2 …

Page 16: Relationships in Django ORM

Query m:1 Relationship

Page 17: Relationships in Django ORM

id = 1

Alan:

Bob:

Cindy:

Page 18: Relationships in Django ORM

Traverse many-to-one relationship

id (pk) = 1post1 = Post.objects.get(pk=1)

comments = Comment.objects.filter(post_id=1)

comments = Comment.objects.filter(post=post1)

[<Comment: Alan: >, <Comment: Bob: >, <Comment: Cindy: >]

Page 19: Relationships in Django ORM

Traverse many-to-one relationship

id (pk) = 1post1 = Post.objects.get(pk=1)

comments = post1.comment_set.all()

<Model>_set

[<Comment: Alan: >, <Comment: Bob: >, <Comment: Cindy: >]

Page 20: Relationships in Django ORM

Associate Post and Comment

post = Post.objects.get(pk=1)

comment = Comment(author=‘Billy’, content=‘hi’)

post.comment_set.add(comment)

Page 21: Relationships in Django ORM

Remove Comment from Post

post1 = Post.objects.get(pk=1)post1.comment_set.all()

[<Comment: Alan: >, <Comment: Bob: >, <Comment: Cindy: >]

c = Comment.objects.get(pk=1)

<Comment: Alan: >

c.delete()

post.comment_set.all()

[<Comment: Bob: >, <Comment: Cindy: >]

Page 22: Relationships in Django ORM

ForeignKey.related_name

comment_list = post.comment_set.all()

comment_list = post.comments.all()

Page 23: Relationships in Django ORM

Foreign Key

• (many-to-one relationship)

• <model>_set

• related_name

• add()

Page 24: Relationships in Django ORM

Many-to-many Relationships

Page 25: Relationships in Django ORM

Tag

myblog.com/post/1

myblog.com/tag/food

Page 26: Relationships in Django ORM

What is Many-to-many Relationship

Post Tag

• tag

• tag

n m

Page 27: Relationships in Django ORM

Tag Model

Page 28: Relationships in Django ORM

SlugField

• CharField

• (hyphen)

• • myblog.com/tags/ (X)

• myblog.com/tags/food (O)

• myblog.com/posts/[ ] (X)

• myblog.com/posts/a-wonderful-trip-in-japan (O)

Page 29: Relationships in Django ORM

Tag Table

id name slug1 food2 japan3 taiwan-north4 taipei

… …taipei

Page 30: Relationships in Django ORM

id title content1 …2 …

Post

Tag

, ,

id name slug1 food2 japan3 taiwan-north4 taipei

… …

Page 31: Relationships in Django ORM

id title content tags1 … 1, 3, 42 … 2

Post

Tag

, ,

id name slug1 food2 japan3 taiwan-north4 taipei

… …

Page 32: Relationships in Django ORM

id title content1 …2 …

Post

Tag

, ,

id name slug1 food2 japan3 taiwan-north4 taipei

… …

id post_id tag_id1 1 12 2 23 1 34 1 4

Page 33: Relationships in Django ORM

ManyToManyField

ManyToManyField(othermodel, **options)

tags = models.ManyToManyField('Tag', blank=True)

Page 34: Relationships in Django ORM

ManyToManyField

• Django m2m

ManyToManyField(othermodel, **options)

Page 35: Relationships in Django ORM

id title content1 …2 …

id name slug1 food2 japan… … …

id post_id tag_id1 1 12 2 23 1 34 1 4

Page 36: Relationships in Django ORM

Query M2M Relationship

from trips.models import Post, Tag

post1 = Post.objects.get(pk=1)

<Post: >

post1.tags.all()

[<Tag: >, <Tag: >]

Page 37: Relationships in Django ORM

Query M2M Relationship

from trips.models import Post, Tag

tag_food = Tag.objects.get(pk=1)

<Tag: >

tag_food.post_set.all()

[<Post: >]

Page 38: Relationships in Django ORM

ManyToManyField.related_name

tag_food = Tag.objects.get(pk=1)

tag_food.post_set.all()

tag_food.posts.all()

Page 39: Relationships in Django ORM

Create M2M Relationship

from trips.models import Post, Tag

post1 = Post.objects.get(pk=1)

tag_japan = Tag.objects.create(name=‘ ’, slug=‘japan’)

tag_food = Tag.objects.get(slug=‘food’)

post1.tags.add(tag_japan)

tag_food.post_set.add(post1)

Page 40: Relationships in Django ORM

Remove M2M Relationship

from trips.models import Post, Tag

tag_japan = Tag.objects.get(slug=‘japan’)

post1 = Post.objects.get(pk=1)

post1.tags.remove(tag_japan)

tag_japan.post_set.remove(post1)

Page 41: Relationships in Django ORM

Filter M2M Relationshipfrom trips.models import Post, Tag

tag_japan = Tag.objects.get(slug=‘japan’)tag_food = Tag.objects.get(slug=‘food’)

tag_japan.post_set.all()

# [<Post: >]

Post.objects.filter(tags=tag_japan)

# [<Post: >]

Post.objects.filter(tags__in=[tag_japan, tag_food])

#[<Post: >, <Post: >]

Page 42: Relationships in Django ORM

ManyToManyField

• Table (Mapping)

• releated_name

• add() , remove()

• https://docs.djangoproject.com/en/1.9/ref/models/relations/

Page 43: Relationships in Django ORM

Get your hand dirty

• Tag

• Tag

• Tag

• Tag Tag

Page 44: Relationships in Django ORM

Tips:

djangogirls/mysite/templates/post.html

Page 45: Relationships in Django ORM

Tips: Tag

djangogirls/mysite/templates/post.html

Page 46: Relationships in Django ORM

Tips: Tag

url(r'^tag/(?P<slug>[\w-]+)/$', tag_detail, name='tag_detail'),

djangogirls/mysite/trips/views.py

djangogirls/mysite/templates/tag.html