Django | C.R.U.D 2 - views.py, urls.py

celeste·2022년 4월 11일
0

Django Basics

목록 보기
5/7
post-thumbnail

Introduction to views

1 HTTP 통신을 통해 Httpie를 사용해서 서버에 요청을 보내고
2 Django Application을 통해 요청을 분석하고 (URLconf)
3 요청을 처리하기 위한 로직을 실행시켜 (View)
4 DB 와 통신하여 데이터 작업을 수행한다. (Model)

지금까지 접한 아이들의 대략적인 역할은?

  • models.py
    : DB와 소통하기 위한 파일
    테이블 생성, 추가, 삭제 등의 관리를 할 수 있다.
  • urls.py
    : 경로를 설정해주는 파일
    웹 브라우저 내에서 접속할 경로를 설정한다.
    application, 최상위 프로젝트의 작업 경로를 지정해줄 수 있다.
  • views.py
    : 기능 구현을 위한 로직을 작성하는 파일
    어떤 요청을 처리해야 되는지 결정 - 내가 처리하고 싶은 로직을 해당 파일 내에 메서드를 선언해서 작업한다.
    get(), post, put, delete
  • manage.py
    : 사이트 관리를 도와주는 스크립트
    다른 설치 작업 없이 웹 서버를 구동할 수 있다
    migrate 작동도 함!
  • settings.py
    : 웹사이트 설정이 있는 파일
    해당 파일 내에 웹 프로젝트 관련 설정을 할 수 있다
    DB연동, 접근허용하는 ip 주소, 등..

urls.py
settings.py 안에 있는 ROOT_URLCONF를 가장 먼저 훑고 지나간다.
'products' 앱이름인것과 동시에 (길안내 표시판), url로서의 기능도 한다 ('products.urls')
settings에 append slash = false 해놓고 작대기 앞에 가게 설정하자.

HTTP Method - get, post, patch, put, delete 등이 있다.

  • get : 정보를 얻을때
  • post : 정보를 생성할때, 새로운 데이터 만들때
  • patch, put : 정보 수정
  • delete :삭제
    ORM과 비슷하다.
    / = 어떤 데이터를 사용할지 결정함. 보통 Path는 자원(Resource)을 식별할 수 있게 되도록 명사를 사용한다.
    어떤 행위를 할지는 HTTP Method로 나타낸다

사전 준비

Client 준비하기 - Httpie

  • Server에 HTTP request를 전송할 수 있는 http client 유틸리티 Httpie 설치 필요
  • brew install httpie

가상환경 세팅하기


전체적인 흐름:
URLconf = (주로) project의 urls.py ➜ app의 urls.py ➜ app의 views.py

프로젝트 시 작업순서(보통 흐름의 반대):
models.py ➜ makemigration ➜ migrate ➜ db확인 ➜ view 작성 ➜ url 맵핑 ➜ httpie
*httpie get/post할때 서버 하나 꼭 켜놓고 시작하기~!

1. Models.py 작성

from django.db import models

class Owner(models.Model):
    name = models.CharField(max_length=45)
    email = models.CharField(max_length=200)
    age = models.IntegerField()

    class Meta:
        db_table = 'owners'


class Dog(models.Model):
    owner = models.ForeignKey('Owner', on_delete=models.CASCADE)
    name = models.CharField(max_length=20)
    age = models.IntegerField()

    class Meta:
        db_table = 'dogs'

-null=True 기본적으로 db에 값 넣을때 모든 필드에 값 넣어야 하는데, 값을 안넣어도 된다고 설정하는것

  • 다만 너무 남발하면 안됨. 필요한 경우에만
  • ERD에 dogs에는 owner_id로 되어있는데, 장고에서 foreign key 주면 자동으로 _id 넣어주기 때문에 만약 dogs에서 owner_id라고 설정해주면 erd 에서 owner_id_id가 된다
  • class명을 Owner라고 했는데 = 'Owner'; 다른 앱에 있는 클래스면 'movies.Owner'

Makemigrations - migrate 진행하기

python manage.py makemigrations
python manage.py migrate

2. Views.py 작성

Models.py에서 작성한 내용이 연결되어 출력될 수 있도록 app폴더 내부에 있는 views.py를 작성한다.

2.1 Post (Create)

import json

from django.http import JsonResponse
from django.views import View

from owners.models import Owner, Dog

# 🚀 OwnerView controller
class OwnersView(View):
    def post(self, request):
        try:
            data = json.loads(request.body)
            Owner.objects.create(
                name = data['name'], #여기서 'name'이라는 key값을 가지고 있는 value를 넣는다는것!
                email = data['email'],
                age = data['age']
            )
            return JsonResponse({'message' : 'created'}, status=201)
        except KeyError:
            return JsonResponse({"MESSAGE": "IVALID_KEY"}, status=400)

# 🚀 DogView controller
class DogsView(View):
    def post(self, request):
        data = json.loads(request.body)
        # owner = Owner.objects.get(name=data['owner'])
        owner = Owner.objects.get(id=data['owner'])
        Dog.objects.create(
            name = data['name'],
            age = data['age'],
            owner = owner
        )
        return JsonResponse({'message' : 'created'}, status=201)

Wrap-up

  • 클래스 안에 있는 def 함수 이름은 httpmethod 안에 있는것과 똑같이 지어줘야함. (post, get 등) 그래야지 httpmethod 왔을때 어떤게 실행될지 지정된다
  • request 인자 = front가 주는 리퀘스트 정보를 담은 객체
  • data = json.loads(request.body) - front와 json 형태로 주고받는데, json 형태를 dictionary로 만들어주는게 json.loads. 그리고 그걸 data 변수에 담는것
  • Owner create
  • JsonResponse이 우리의 dictionary 형식을 json으로 바꿔서 response로 보내준다

owner = Owner.objects.get(id=data['owner']) 여기서는, id=3 이 들어갔을때, id=3을 가지고 있는 모든 owner 값의 행 자체를 object(객체) 형태로 가져온다는 뜻이다.
그리고 그 객체 형태의 name, age를 지정한대로 가져온다.

  • Django 자체의 View 불러오기: from django.views import View

  • from django.views import JsonResponse : json 형식으로 프론트와 통신하는데, dictionary 자료구조만이 json으로 바로 변환이 가능하다

    • JsonResponse 장고에서 지원해주는, dictionary를 넣어주면 json으로 변환해주는 기능
    • JSON형식의 request를 받아올 때는 json.loads(), 다시 JSON형식으로 response를 반환할 때는 JsonResponse를 사용한다.
    • getAll()메서드를 사용하면 딕셔너리 형태로와서 바로 쓸 수 있어서 편하지만, 다양한 연습을 위해 all()메서드를 사용한 뒤, response 구간에서 자료구조를 바꾸어 주도록 http에서 할것이다
  • models.py의 class(테이블) 불러오기: from .models import Owner, Dog(똑같은 디렉토리인 owners app에서 불러오므로, '.'(dot)만 입력하면 되긴한다)

  • class view생성(View 상속) 뒤, 구현하고자 하는 로직을 함수 형태로 입력

    • View클래스명은 model에 있는 class랑 헷갈릴 수 있기 때문에 ProductsView이름에 View 붙여준다
    • class view 생성하려면 View를 인자로 받아야 한다 (class OwnersView(View):)
    • View 를 상속 받았기 때문에 Post 요청 가능
  • 성공을 의미하는 Status Code 중, 생성은 201번으로 반환한다.

views.py에서 Foreignkey 필드 데이터를 POST요청으로 생성하는 로직을 만드는 두 가지 방법

  • Foreignkey 필드에 대한 값으로 참조 테이블(바라보는 테이블)의 특정 '객체'를 할당
    • 외래키 필드명= Owner.objects.get(name=data['owner']))
  • Foreignkey 필드에 대한 값으로 참조 테이블의 특정 '객체의 데이터'를 할당
  • 외래키 필드의 db_column명'= Owner.objects.get(name=data['owner'].id))
  • 두 가지 방법 중 편한 걸 사용하면 된다.
  • 아래의 예시는 외래키 필드의 db_column명에 특정 객체의 데이터가 할당됐다.
class DogView(view):
    def post(self, request):
        data = json.loads(request.body)
        owner = Owner.objects.get(name=data['owner'])
    	Owner.objects.create(
            name = data['name']
            age = data['age']
            owner_id = owner.id  # db_column명 = 특정 객체의 데이터
        )
        return JsonResponse({'message':'SUCCESS'}, status=201)
  • foreign key로 걸려있는거(owner 이름)에 데이터를 넣으려면 데이터가 존재해야 한다

  • 존재하는 owner를 먼저 들고와서 넣었는데,

  1. 객체 직접 불러와서
    실제 column은 owner_id 으로 되어있으니까 데이터베이스 가지 않고 거기서 바로 owner_id = 2` 불러냄

data의 ower, hun인 데이터를 찾아서
그 객체가 owner에 담기게 되고,
hun의 주인의 id가 설정된다

owner = data["owner_id"]
왼쪽이 속성의 owner이기 때문에 데이터베이스의 컬럼명 써주면 된다
오린쪽의

if.exists로 exception 처리-> true/false만 판별하는거면 데이터베이스까지 안가도 되서 .exists 붙인다

정방향 참조 vs 역방향 참조

  • Foreignkey field가 정의된 테이블(자식 테이블)에서 부모 테이블의 필드값에 접근하는 것을 뜻한다.(정방향)
    • 방법: 자식 테이블 객체.외래키 필드 이름.접근하려는 부모 테이블의 필드 이름
    • ex)Dog.objects.get(name='흰둥이').owner_id.name
  • 참조 대상 테이블(부모 테이블)에서 자식 테이블의 객체에 접근하는 것(역방향)
    • 방법: 부모 테이블 객체.자식 테이블 이름(소문자)_set.all()
    • 부모 테이블의 객체가 복수의 자식 테이블 객체를 참조하고 있을 수 있기 때문에 쿼리셋 형태로 데이터를 리턴한다.
    • ex) Owner.objects.get(name='james').dog_set.all()
    • all() 대신 filter()를 사용해 하나의 객체만을 가져오고 싶은 경우...
      • ex) Owner.objects.get(name='james').dog_set.filter(name='흰둥이').first().age
class OwnerView(view):
    def get(self, request):
        result = []
        owners = Owner.objects.all()
        
        for owner in owners:
            dogs = owner.dog_set.all()   # 역방향 참조로 복수의 데이터 객체를 가져옴
            dog_list = []
            for dog in dogs:
                dog_information = {
                   'name':dog.name,
                   'age':dog.age,
                }
                dog_list.append(dog_information)
            owner_information= {
                'name':owner.name,
                'email':owner.email,
                'age':owner.age,
                'dogs':dog_list
            }
            
            result.append(owner_information)
        return JsonResponse({'result':result}, status=200)

✔️ httpie를 사용하여 POST 요청(string type)은 아래와 같이 한다. path를 적은 뒤, key와 value를 매핑한다.
$ http -v POST 127.0.0.1:8000/[path] key1="value1" key2="value2" key3="value3"
http -v POST 127.0.0.1:8000/owners owner="4" name="Dillon" age="20"

2.2 Get (Read)

# from django.shortcuts import render
import json
from django.http import JsonResponse
from django.views import View
from owners.models import Owner, Dog
# 🚀 OwnerView controller
class OwnersView(View):
    def post(self, request):   # 👈 POST 요청일 때 작동
        try:
            data = json.loads(request.body)
            Owner.objects.create(
                name = data['name'],
                email = data['email'],
                age = data['age']
            )
            return JsonResponse({'message' : 'created'}, status=201)
        except KeyError:
            return JsonResponse({"MESSAGE": "IVALID_KEY"}, status=400)

    def get(self, request):    # 👈 GET 요청일 때 작동
        owners = Owner.objects.all() # owner테이블의 모든 레코드를 QuerySet으로 t불러온다.
        results  = [] # owner를 출력할 리스트
        for owner in owners:
            results.append(
                {
                    "name" : owner.name,
                    "email" : owner.email,
                    "age" : owner.age
                }
            )
        return JsonResponse({'resutls':results}, status=200)
        
# 🚀 DogView controller
class DogsView(View):
    def post(self, request):    # 👈 POST 요청일 때 작동
        data = json.loads(request.body)
        # owner = Owner.objects.get(name=data['owner'])
        owner = Owner.objects.get(id=data['owner'])
        Dog.objects.create(
            name = data['name'],
            age = data['age'],
            owner = owner
        )
        return JsonResponse({'message' : 'created'}, status=201)
# http -v POST 127.0.0.1:8000/owners owner="4" name="Dillon" age="20"

    def get(self, request):    # 👈 GET 요청일 때 작동
        owners = Owner.objects.all()
        dogs = Dog.objects.all() # owner테이블의 모든 레코드를 불러온다.
        results  = [] # owner를 출력할 리스트
        try:
            for dog in dogs:
                results.append(
                    {
                        "name" : dog.name,
                        "age" : dog.age,
                        "owner" : dog.owner.name #주인 이름
                    }
                )
            return JsonResponse({'results':results}, status=200)
        except KeyError:
            return JsonResponse({"MESSAGE": "IVALID_KEY"}, status=400)
# http -v GET 127.0.0.1:8000/owners/dogs

# 🚀 OwnersDogView controller
class OwnersDogView(View):
    def get(self, request):
        owners = Owner.objects.all()
        dogs = Dog.objects.all()
        results  = [] # owner를 출력할 리스트
        for dog in dogs:
            for owner in owners:
                if owner.id == dog.owner_id:
                    results.append(
                        {
                            "name" : owner.name,
                            "age" : owner.age,
                            "email" : owner.email,
                            "dog_name" : dog.name,
                            "dog_age" : dog.age
                        }
                    )
        return JsonResponse({'results':results}, status=200)

✔️ DB에서 데이터와 Dict형으로 처리한 후, 가공한 데이터를 JsonResponse을 사용해 JSON형식으로 클라이언트로 반환해주면 된다.
✔️ 이제 아래와 같이 Httpie 요청을 보내면, DB에서 값을 불러와 JSON형태로 반환해준다.

http -v GET 127.0.0.1:8000/owners 👈 OwnerView에 get 매서드 작동
http -v GET 127.0.0.1:8000/owners/dogs 👈 DogView에 get 매서드 작동

보완 : Comprehension 문법 활용하여 View 작성하기

🤔 for문을 통해 자료구조를 만드는 것보다 Comprehension이 속도가 빠르다.

✔️ Comprehension 문법은 List, Dict, Tulple 등 모두 사용할 수 있고, for문을 통해 append하는 것보다 속도가 빠르다.

import json
from django.http import JsonResponse
from django.views import View
from .models import Owner, Dog
# 🚀 OwnerView controller
class OwnerView(View):
    def post(self, request):
        try:
            data = json.loads(request.body)
            Owner.objects.create(
                name=data["name"], email=data["email"], age=data["age"]
            )
        except KeyError:
            return JsonResponse({"MESSAGE": "IVALID_KEY"}, status=400)
        return JsonResponse({"MESSAGE": "CREATED"}, status=201)
    def get(self, request): # 👈 2중 List Comprehension
        result = [
            {
                "name": owner.name,
                "mail": owner.email,
                "age": owner.age,
                "my_dogs": [
                    {"name": dog.name, "age": dog.age} for dog in owner.dogs.all() # 👈 related_name 사용으로 "dogs"로 역참조
                ],
            }
            for owner in Owner.objects.all()
        ]
        return JsonResponse({"MESSAGE": result}, status=200)
# 🚀 DogView controller
class DogView(View):
    def post(self, request):
        try:
            data = json.loads(request.body)
            Dog.objects.create(
                name=data["name"],
                age=data["age"],
                owner=Owner.objects.get(name=data["owner"]),
            )
        except KeyError:
            return JsonResponse({"MESSAGE": "IVALID_KEY"}, status=400)
        return JsonResponse({"MESSAGE": "CREATED"}, status=201)
    def get(self, request): # 👈 List Comprehension
        result = [
            {
                "name": dog.name,
                "age": dog.age,
                "owner": dog.owner.name,
            }
            for dog in Dog.objects.all()
        ]
        return JsonResponse({"MESSAGE": result}, status=200)
#OwnerView 
class OwnerView(View):
    def get(self,request):
        result = [{
            'name'  : owner.name,
            'email' : owner.email,
            'age'   : owner.age,
            'dog_info' : [{
                'name' : dog.name,
                'age'  : dog.age
            } for dog in owner.dog_set.all()]} for owner in Owner.objects.all()]
            #dog name/age는 dog테이블로 역참조해서 갖고 온다 
            #Owner:Dog=1:N, 1-> N의 형태는 역참조임 
        
        return JsonResponse({'result':result},status=201)
 
 
#DogView
class DogView(View):
    def get(self,request):
        result = [{'name':dog.name,'age':dog.age,'host_name':dog.owner.name} for dog in Dog.objects.all()]
        #dog.owner.name: 해당 dog 데이터의 owner(owner_id)의 이름 
        
        return JsonResponse({"message":result},status=201)

3. app폴더 내의 urls.py

(🌱urls.py 파일이 없기 때문에 만들어줘야 한다)
app views.py 에서 ClassView 가져오고 링크 해준다

from django.urls import path
from owners.views import OwnersView, DogsView, OwnersDogView

urlpatterns = [
    path('', OwnersView.as_view()),
    path('/dogs', DogsView.as_view()),
    path('/ownersdog', OwnersDogView.as_view())
]

경로를 이렇게 설정해줘야지만
아래 HTTPie 실행이 가능해진다.
POST:
http -v POST 127.0.0.1:8000/owners owner="4" name="Dillon" age="20"
http -v POST 127.0.0.1:8000/owners/dogs owner="2" name="Tom" age="4"
GET:
http -v GET 127.0.0.1:8000/owners
http -v GET 127.0.0.1:8000/owners/dogs
http -v GET 127.0.0.1:8000/owners/ownersdog

🌹 해당 주소로 와야 그에 view를 실행한다고 생각하면 된다.
만약 여기 없는 주소를 project urls.py에서 찾아오면, 에러가 난다

🌹 as_view()가 HTTPMethod의 get, post 등 판단해서 Class 안에 똑같은 이름의 메소드와 매칭시켜준다

🌹 만약 새로운 Class 추가해준다면, 여기 import 에도 추가해줘야 한다!

4. project폴더 내의 urls.py

메인 urls.py에서 owners 앱의 urls.py로 처리를 위임하도록 include를 사용하여 지정한다.

from django.urls import path, include

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('owners',include('owners.urls'))
]

어느 앱으로 보내줄지 정도만 main.py에 넣는 편이다.

http://127.0.0.1:8000/users/aaa으로 보낸다면,
위에 path가include('users.urls') 이면 users.urls 읽고 거기서 다시 분석을 시작함.

5. Httpie 전송

아까 위에서도 여러번 언급했지만, HTTPie 형식에 맞게 보내주면 된다.

POST:
http -v POST 127.0.0.1:8000/owners owner="4" name="Dillon" age="20"
http -v POST 127.0.0.1:8000/owners/dogs owner="2" name="Tom" age="4"
GET:
http -v GET 127.0.0.1:8000/owners
http -v GET 127.0.0.1:8000/owners/dogs
http -v GET 127.0.0.1:8000/owners/ownersdog

🌹 HTTPie non-integer 보낼때 := 사용해준다. (EX. age:=12)

역참조

주인 > 강아지
강아지는 주인 정보가 있지만, 주인은 강아지 정보가 없음.

dog = owner.dog_set.all()

  1. Class 이름 다 소문자로 바꾸기
  2. _set을 붙이기
  3. 객체가 정해져 있어야함 - 그것과 관련된 애들을 불러와야하기 때문
    ex. owner=1 지정함

owner와 관련된 모든 dog 객체들을 가져오라는 의미
object와 같은 역할을 하니까 all, filter, 등 사용가능하다

MySQL 에서 입력한 데이터 확인하기

SHOW databases; 데이터베이스를 보여줘!
Use Owners; 사용하려는 데이터베이스명으로 변경
SHOW tables; 테이블을 보여줘!
select * from Owners; owners의 데이터를 보겠다
select * from dogs; dogs의 데이터를 보겠다

기타 내용 정리

  • split view : cmd + shift + d

git commit

generic/base.py", line 119, in dispatch
Feat: Owners app 생성 및 POST 구현

  • Owners 앱을 만들고, 모델 클래스 생성
  • Post 신규 주인 등록, 강아지 등록 구현

git commit -m "Add: owners post feature"

git push origin feature/owner

2세션


model에 있는 class랑 헷갈릴 수 있기 때문에 ProductsView이름에 View 붙여준다

def 함수 하나가 API 하나이다
함수 이름은 HTTP MEthod 이름과 똑같이 만드는게 대부분
맵핑할 수 있게끔 설정한다

self = class 안에 있는 함수니까 self로 시작

client 에서 오는 모든 request를 담고 있는 객체
body, header 등 모든 정보 가져올 수 있다


post니까 정보를 생성할건데, 정보는 프론트에서 주는 정보고, 그 정보를 우리가 사용할 수 있게 만들것이다.
request는 객체니까 . 사용할 수 있다
request.body
JSON 으로 오기 때문에 dictionary로 바꿔줘야 하고, 그걸 바꿔주는게 json.loads
바꿀 대상이 request.body
그걸 data 변수에 저장


menu랑 매칭되어 있는 테이블에 데이터 생성할건데,
data 안에 있는 애중에 menu라는 키 가진 애를 넣는다
다시 menu에 담기


category 똑같은데
foreign key menu=menu 있다
왼쪽에 있는 menu는 category class 안에 있는 menu=models.ForeignKey 속성
오른쪽에 있는건 넣어주는 값 - 위에 menu=Menu.objects.create

Product도 생성


return Dictionary형태 보낸다 status code와 함!께

여기까지 연결시켜 주는게 urls.py



main urls.py는 app 까지만 보내고
products app 안에 있는 urls.py
근데 자동으로 안만들어짐
cd products
touch urls.py

from django.urls.import path
urlpatters = [
]

App 에 있는거 vs. main

django가 자동으로 127.0.0.1:8000/ 까지 만들어주고
products
/aaa
앱쪽으로 옮김

path('/aaa', ProductsView.as_view())
/bbb 처럼 존재하지 않는걸 요청하면 not found 에러가 난다
'' 아무것도 안쓰면 어떤 요청이 와야 이 view를 실행할 수 있을까? 아무것도 없는걸 찾아서 실행함. 127.0.0.1:8000/products 처럼

이렇게 까지 하면, products.views.py 를 가르키는 것이다
클래스를 가르키는 것이지 어떤 api, 어떤 함수를 실행할 것인지는 말해주지 않는다

tutorial에서는 어떤 함수를 실행하라고 지칭했을것이다

class 형일때는 어떻게 판단할 수 있을까?

HTTPMEThod랑 함수 이름이랑 같은걸 실행시킨다. 그래서 같아야 한다!!
.as_view가 어떤 요청이 왔는지 판단하고 그 요청에 맞는 함수를 실행시킨다


get

drinks 정보를 다 가져와서
menu, category, drink_name 내용 다 가져온다
all() 돌리면 QuerySet 나오기 때문에, list처럼 for문 돌릴 수 있다.
for문 한번 돌릴때마다 해당 객체에 대한 정보를 꺼낼 수 있다

이걸 view에 옮기면 된다

빈 리스트를 만들어 놓아야한다.
for문 돌고 한번더 돌면 전에 만들어진게 없어지기 때문에
첫번째 for문에서 만들어진 것을 append해줘야 저장해놓을 수 있다

product가 category를 foreign key를 가지고 있으니까
product.category 하면 category class 를 가르키고
menu.name
3:05분


프론트가 준 body를 json 형태로 바꿔서 data 변수에 담는다
data['name'] -> 만약 이 'name'이라는 키를 주지 않으면??
KeyError 에러가 난다
try
except KeyError:
return JSONRequest KeyError 하면 프론트가 키 잘못 준 탓!!

선택과제 : 배우와 영화

Many to Many 관계 이해하기

Models.py

✔️중간테이블 만들기

movies = models.ManyToManyField(Movie, through='MovieActor')
✔️ManyToManyField 한쪽에 선택해서 만들어주기

  • 만약 중간테이블 안만들었으면 이거 선언해주는 순간에 자동으로 만들어짐
  • 근데 장고가 만들어준거기때문에 컨트롤하기 어려워서 중간테이블 수기로 만들어주는게 좋다.
  • 만든 중간테이블을 through에 넣어주면 내가 만든 중간테이블을 사용하겠다는 의미!

Views.py

배우가 출연한 영화정보를 가져오기 위해서
movies = actor.movies.all()
Actor class 안에 movies라고 정의했기 때문에 (manytomany 관계 정의함) 가능한것
매니저클래서

주로 사용하는 곳 위주로 manytomany field 넣으면 된다
정참조로 가져올 수 있는곳

Movie.objects.filter(movieactor__actor=actor)
movieactor__actor=actor
언더바 두개 쓰면 안에 있는 movieactor 안에 있는거
equal sign 오른쪽 actor는 객체
왼쪽은

Dog.objects.filter(owner__age=21)
dog 안에 owner 있는데
owner안에 참조하고 있는 Owner class 볼수 있다

없어도 역참조 관계를 가져올 수 있다
movie 입장에서 movieactor는 역참조

Movie.objects.filter(movieactor__actor__last_name='송')
movie를 갖고 올건데, 거기에 출연한 actor의 last name 이 송인 사람을 가져오는것
actors = movie.actor_set.all()
이건 역참조 하면 된다

ManagerClass = ORM을 쓰게끔 도와주는것. ex) 역참조, manytomany 등

0개의 댓글