728x90
보충학습 강의자료를 다시한번 재작성하며, 이해도 높이기.
python class 관련 용어 및 클래스 상속 구조 정리
# A 클래스
class A:
# init 메소드(혹은 함수)
def __init__(self, ):
# init 메소드는 인스턴스(혹은 오브젝트)가 생성될 때 실행된다.
print("A 클래스의 init 메소드가 실행됐습니다!")
# A 클래스의 hi 메소드(혹은 클래스 함수)
def hi(self, ):
print("hello A!!")
class B(A):
# B 클래스는 A 클래스를 상속 받았다.
# A 클래스는 B 클래스의 부모(혹은 슈퍼) 클래스이다.
# B 클래스는 A 클래스의 자식(혹은 서브) 클래스이다.
# A 클래스의 init 메소드를 overriding
def __init__(self, ):
# super(부모) 클래스의 __init__ 메소드 실행
super().__init__()
print("B 클래스의 init 메소드가 실행됐습니다!")
class C(A):
# A 클래스의 hi 메소드를 overriding
def hi(self, ):
# super 함수는 호출 해도 되고 호출하지 않아도 된다.
# super().hi()
print("hello C!!")
class D:
pass
# b 오브젝트(혹은 B 클래스의 인스턴스) 생성
b = B() # 오브젝트가 생성되며 overriding 된 B 클래스의 __init__ 메소드가 실행 됨
b.hi() # 부모 클래스인 A 클래스의 hi() 메소드가 실행 됨
# c 오브젝트 생성
c = C() # 오브젝트가 생성되며 부모 클래스인 A 클래스의 __init__ 메소드가 실행 됨
c.hi() # overriding 된 C 클래스의 hi 메소드가 실행 됨
# d 오브젝트 생성
d = D() # __init__ 메소드가 정의되지 않았기 때문에 아무것도 실행되지 않음
패킹과 언패킹(*args, **kwargs) 복습
패킹과 언패킹이란?
패킹(packing)과 언패킹(unpacking)은 단어의 뜻 그대로 요소들을 묶어주거나 풀어주는 것을 의미합니다. list 혹은 dictionary의 값을 함수에 입력할 때 주로 사용됩니다.
list에서의 활용
def add(*args):
result = 0
for i in args:
result += i
return result
numbers = [1, 2, 3, 4]
print(add(*numbers))
""" 아래 코드와 동일
print(add(1, 2, 3, 4))
"""
# result output
"""
10
"""
dictionary에서의 활용
def set_profile(**kwargs):
profile = {}
profile["name"] = kwargs.get("name", "-")
profile["gender"] = kwargs.get("gender", "-")
profile["birthday"] = kwargs.get("birthday", "-")
profile["age"] = kwargs.get("age", "-")
profile["phone"] = kwargs.get("phone", "-")
profile["email"] = kwargs.get("email", "-")
return profile
user_profile = {
"name": "lee",
"gender": "man",
"age": 32,
"birthday": "01/01",
"email": "python@sparta.com",
}
print(set_profile(**user_profile))
""" 아래 코드와 동일
profile = set_profile(
name="lee",
gender="man",
age=32,
birthday="01/01",
email="python@sparta.com",
)
"""
# result print
"""
{
'name': 'lee',
'gender': 'man',
'birthday': '01/01',
'age': 32,
'phone': '-',
'email': 'python@sparta.com'
}
"""
장고에서 자주 사용되는 코드
데이터 저장하기
""" 특정 object 생성하기 """
# case 1
Model.objects.create(title="제목", content="내용") # 데이터를 입력함과 동시에 저장
# case 2
obj = Model()
obj.title = "제목"
obj.content = "내용"
obj.save() # 데이터 입력 후 따로 저장
# case 3
article = Article.objects.create(title="제목", content="내용") # 데이터를 저장하며 해당 object를 article이라는 변수에 저장
commant = Commant.objects.create(article=article, content="댓글")
데이터베이스에서 원하는 데이터 찾기
""" 특정 object 가져오기 """
# objects.get에서 객체가 존재하지 않을 경우 DoesNotExist Exception 발생
try:
Model.objects.get(id=obj_id)
except Model.DoesNotExist:
# some event
return Response({"error": "존재하지 않는 오브젝트입니다."}, status=400)
""" 특정 queryset 가져오기 """
Model.objects.filter(join_date="2023-01-01") # join_date 값이 2023-01-01인 데이터 검색
Model.objects.filter(join_date__lte="2023-01-01") # join date 값이 2023-01-01 이전인 데이터 검색
# lt : less than
# lte : less than equal
# gt : greater than
# gte : greater than equal
Model.objects.filter(title__contains="제목") # title에 "제목"을 포함하는 데이터 검색
Model.objects.filter(hobby__in=["운동", "산책"]) # hobby가 list에 포함되어 있는 데이터 검색
Model.objects.filter(fullname__startswith="이") # fullname이 "이"로 시작하는 데이터 검색
# startswith : ~로 시작하는 조건
# endswith : ~로 끝나는 조건
Model.objects.exclude(created_at__gte="2023-01-01") # created_at 값이 2023-01-01보다 크거나 같은 데이터를 제외
# filter : 특정 조건이 매칭되는 데이터를 남겨줌
# exclude : 특정 조건이 매칭되는 데이터를 제외함
""" 기존 검색 결과에서 추가로 필터링 혹은 제외하기 """
queryset = Model.objects.filter(title__contains="제목") # queryset 변수에 title에 "제목"을 포함하는 데이터 저장
queryset = queryset.objects.filter(created_at__gte="2023-01-01") # 기존 queryset 결과에 created_at 값이 2023-01-01보다 크거나 같은 데이터를 필터링
queryset = queryset.objects.exclude(is_active=False) # 기존 queryset 결과에 is_active 값이 False인 데이터를 제외
""" 2개 이상의 조건을 사용해 queryset 가져오기 """
Model.objects.filter(title__contains="제목", content__contains="내용") # title에 "제목"을 포함하고 content에 "내용"을 포함하는 데이터 검색
# from django.db.models import Q
Model.objects.filter(Q(title__contains="제목") | content__contains="내용") # title에 "제목"을 포함하거나 content에 "내용"을 포함하는 데이터 검색
""" queryset 정렬하기 """
# .order_by("?")사용시 무작위 셔플
# -created_at처럼 "-"를 붙이면 역순으로 정렬
Model.objects.all().order_by("created_at") # created_at을 기준으로 졍렬
""" 조건에 맞는 object를 가져오거나 생성하기 """
# 입력한 object가 존재 할 경우 해당 object를 가져오고, 존재하지 않을 경우 새로 생성
obj, created = Model.objects.get_or_create(
field1="value1",
field2="value2",
)
if created:
# created event
pass
else:
# already exist event
pass
데이터 수정하기
""" 특정 object 생성하기 """
obj = Model.objects.get(id=1) # id가 1번인 object를 obj 변수에 저장
obj.title = "변경 된 제목" # 해당 object의 제목 변경
obj.save() # 변경사항 적용
728x90
'내배캠 > TIL' 카테고리의 다른 글
TIL/31/20230424 (0) | 2023.04.24 |
---|---|
TIL/30/20230421 (0) | 2023.04.22 |
TIL/28/20230419 (0) | 2023.04.19 |
TIL/27/20230418 (0) | 2023.04.18 |
TIL/26/20230417 (0) | 2023.04.18 |