Django ipython shell(objects.all, create, filter)

|

패스트캠퍼스 웹 프로그래밍 수업을 듣고 중요한 내용을 정리했습니다.
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
이 포스팅에서는 djangogirls-tutorial을 보고 정리했습니다.


object.all()

/projects /django /djangogirls-tutorial /app 에서 python manage.py shell


# blog파일의 models.py에 있는 class Post를 import
from blog.models import Post

# class Post의 objects 모두 호출
Post.objects.all()
<QuerySet [<Post: INSTALL COMMAND LINE>, <Post: 박보영>, <Post: 어벤져스>, <Post: 토르>, <Post: 캡틴 아메리카>]>

# 이때
post_list = Post.objects.all()
print(type(post_list))

# post_list의 type은 QuerySet
>>> <class 'django.db.models.query.QuerySet'>

for post in post_list:
  print(post)
"""
INSTALL COMMAND LINE
박보영
어벤져스
토르
캡틴 아메리카
"""

for post in post_list:
  print(type(post))
"""
<class 'blog.models.Post'>
<class 'blog.models.Post'>
<class 'blog.models.Post'>
<class 'blog.models.Post'>
<class 'blog.models.Post'>
"""

object.create()


# Post에 새로운 objects를 만들기 위해서 create를 사용한다.
Post.objects.create(
  name=me,
  title='New Post'
  text='New post text'
)

# 그러나 아직 name에 해당하는 값이 존재하지 않는다.
>>> NameError: name 'me' is not defined

# django /contrib /auth /models.py에 있는 class User를 import
from django.contrib.auth.models import User

# User의 objects를 모두 호출하면
User.objects.all()
# Username : pjh
>>> <QuerySet [<User: pjh>]>

# User의 objects 중 1번째 요소를 user라는 변수에 할당
user = User.objects.all()[0]
user
>>> <User: pjh>

# 해당 객체의 type은 User라는 class
print(type(user))
>>> <class 'django.contrib.auth.models.User'>

User.objects.create(
  name=user,
  title='New Post',
  text='New post text'
)

# New Post라는 새로운 Post가 생성됐다.
>>> <Post: New Post>

# 해당 포스트가 잘 들어갔는지 확인하기 위해 for문을 이용해본다.
for post in Post.objects.all():
  print(post)
"""
INSTALL COMMAND LINE
박보영
어벤져스
토르
캡틴 아메리카
New Post
"""

objects.filter()


# Post의 objects중에 title에 '캡틴'이 포함되는 애들만 filtering
Post.objects.filter(title__contains='캡틴')
>>> <QuerySet [<Post: 캡틴 아메리카>]>

# Post의 objects중에 text에 '토르'가 포흠되는 애들만 filtering
Post.objects.filter(text__contains='토르')
>>> <QuerySet [<Post: 어벤져스>, <Post: 토르>]>

# django폴더 내 utils.py에서 class timezone import
from django.utils impost timezone

# Post의 objects들중에 현재 시간보다 과거에 발행했던 애들을 호출 (lte: less than or equal to)
Post.objects.filter(published_date__lte=timezone.now())
# 아직 발행날짜를 기입한 요소가 없기때문에 빈 리스트가 출력됨
<QuerySet []>

post = Post.objects.all()[0]
# 첫 번째 Post.objects에 발행날짜를 기입
post.publish()

post
<Post: INSTALL COMMAND LINE>

Post.objects.filter(published_date__lte=timezone.now())
# 이제는 발행일자를 기입한 항목이 있기 때문에 현재 시간보다 과거에 발행된 요소가 나타난다.
<QuerySet [<Post: INSTALL COMMAND LINE>]>

order_by()


# Post의 objects들의 title을 오름차순으로 순회
for post in Post.objects.order_by('title'):
  print(post)
"""
INSTALL COMMAND LINE
New Post
박보영
어벤져스
캡틴 아메리카
토르
"""

# Post의 objects들의 title을 내림차순으로 순회
for post in Post.objects.order_by('-title'):
  print(post)
"""
토르
캡틴 아메리카
어벤져스
박보영
New Post
INSTALL COMMAND LINE
"""

# Post의 objects중에서 title에 'N'이 포함되는 것들 중, 오름차순으로 정렬
for post in Post.objects.filter(title__contains='N').order_by('-title'):
  print(post)
"""
New Post
INSTALL COMMAND LINE
"""

# Post의 objects중에 id가 2(두번째 Post)
Post.objects.filter(id=2)
>>> <QuerySet [<Post: 박보영>]>

# Post의 objects중에 id가 2인 애 중의 1번째 요소
Post.objects.filter(id=2)[0]
>>> <Post: 박보영>

# post_id라는 변수에 1이라는 값을 지정하고
post_id = 1
# Post의 objects중 id가 post_id(1)
Post.objects.filter(id=post_id)
>>> <Post: INSTALL COMMAND LINE>