model shell

떵떵·2022년 4월 21일
0

django

목록 보기
3/5

model 생성

from django.db import models

class Question(models.Model):
    subject = models.CharField(max_length=200)
    content = models.TextField()
    create_date = models.DateTimeField()

class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    content = models.TextField()
    create_date = models.DateTimeField()

터미널에서 python manage.py shell 으로 model을 직접 작동할 수 있음

from pybo.models import Question, Answer

Question 생성

models에서 만들어 놓은 테이블들 import 함

q = Question(
	subject='너는 하루에 운동을 몇 시간 하니?',
	content='나는 하루에 1시간씩 하기를 하고있어.',
	create_date=timezone.now()
)

q.save()

Question의 객체 q를 생성 후 save()함수로 저장함 -> 질문 하나 생성
데이터 1건이 생성될 때마다 pk(primary key)가 1씩 증가함

a.id()
>>> 1

id()함수로 pk값을 조회할 수 있음

Question 조회

Question.objects.all()

Question.objects()로 Question 모델의 데이터를 조회할 수 있고 Question.objects.all()은 모든 Question 데이터를 조회하는 함수이다. 결과값으로 QuerySet 객체가 리턴되는데 다음처럼 Question 객체를 포함하고있다.

<QuerySet [<Question: Question object (1)>, <Question: Question object (2)>]>

다음처럼 모델에 str 메서드를 추가하면 id값 대신 제목을 표시할 수 있음(subject : 제목)

def __str__(self):
        return self.subject

다음은 str 메서드를 추가 전 후 비교

>>> Question.objects.all()
<QuerySet [<Question: pybo가 무엇인가요?>, <Question: 장고 모델 질문입니다.>]>

filter(id=[원하는pk])로 데이터 조회 가능

Question.objects.filter(id=1)

filter()로 조회할시 조건에 해당하는 데이터를 모두 리턴해 주기 때문에 다건을 의미하는 QuerySet이 리턴된다.
filter() 대신 get()을 이용하여 조회할 수 있는데 이경우 QuerySet이 아닌 Question 모델 객체가 반환된다.
filter() = 다건, get() = 한건

get()은 반드시 한 건을 조회할 때 사용되며 보통 id와 같은 유일한 값으로 조회할 경우에만 사용한다.

조건부 검색

subject에 "운동"이라는 문자열이 포함된 데이터만 조회하는 방법

Question.objects.filter(subject__contains='운동')

subjectcontains='운동'의 의미는 "subject에 '운동'이라는 문자열이 포함되어 있는가?" 라고 해석할 수 있다. subjectcontains 에서 언더바(_)가 1개가 아닌 2개임에 주의해야 한다.

Question 수정

다음은 특정 id의 데이터를 조회화여 수정해보겠다.

q = Question.objects.get(id=1)
q.subject = "I love django"
q.save()

get()함수로 id=1인 데이터를 가지는 q객체를 생성하고 subject를 "I love django"로 바꾸었다, 이후 save()함수로 저장을 하였으며 save()를 꼭 써야 수정이 적용 된다.

Question 삭제

다음은 특정 id의 데이터를 삭제 해보겠다.

q = Question.objects.get(id=1)
q.delete()
(1, {'pybo.Question': 1})

(1, {'pybo.Question': 1}) 은 Question 모델이 1개 삭제되었음을 알린다.

Answer 작성

위의 model생성에서 Answer에는'question', 'content', 'create_date'가 있으며 Answer 작성시 이들을 지정해주어야 함.
blank=True 로 안 넣어도 되도록 설정할 수 있음

>>> q = Question.objects.get(id=1)
>>> from django.utils import timezone
>>> a = Answer(question=q, content='운동 허세 지리네 ㅋㅋ', create_date=timezone.now())
>>> a.save()

Question 모델 q객체를 생성하여 get()함수로 id=1인 데이터를 생성하고
a에 Answer 모델의 객체를 생성하면서 위에 Answer의 항목들을 하나 하나 지정 해 준다.
'question'은 Question의 외래키로 question이 저장된 q를 넣어줘서 q에 대한 답변이라는 것을 설정하고
'content' 에 답변의 내용, create_date에 timezone을 import하여 now()함수로 현재 시간을 넣어준다.

Answer 조회

a = Answer.objects.get(id=1)
a
<Answer: Answer object (1)>

위처럼 a에 get()함수로 Question 조회에서 했던 것처럼 특정 id를 조회하여 저장하고 조회할 수 있다.

>>> a.question
<Question: Django Model Question>

테이블의 요소를 위처럼 호출하여 조회할 수 있다.

0개의 댓글