MVC - Model, View, Controller

MTV (Django) - Model, Template, View


wsgi.py
- 웹 서버와 장고를 적절히 결합해주는 역할.
- Brower에서 요청을 하면 WSGI로 신호가 들어옴.
- 이 파일은 딱히 건드릴 필요없음.
urls.py
- 이 파일은 정규표현식으로 view.py로 보내줌
views.py
- 실질적으로 코딩을 많이 하는 파일.
- 사용자의 요청에 의해서 db의 데이터를 입력하거나 db로부터 데이터를 가져와서 리스트를 보여줄건지 결정
- 그리고 model로 보냄
models.py
- db로부터 데이터를 가져와서 클래스를 만들고, 그 클래스를 조작.
template (example.html)
- 로직이 들어가있음.
- view에서 받은 파일을 어떻게 잘 보여줄지 보여줌.
- 다양한 폼을 작성함.
ForeignKey
ForeignKey 는 1:N 관계를 의미합니다. 예를 들어 게시글과 댓글을 생각할 수 있습니다. 하나의 글에는 그 글에 해당하는 댓글이 여러 개 존재하게 되므로 ForeignKey 를 만족합니다.
class Post(models.Model):
# 생략
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
-
1:N 중에서 N 인 쪽에서 관계를 선언해주며, 두 개의 인자를 필요로 합니다. 하나는 대상이 되는 클래스, 다른 하나는 삭제 시 이슈에 대한 설정입니다.
-
on_delete 설정
각각에 대한 설명은 1인 쪽의 데이터가 삭제 되었을 시, N 인 쪽의 데이터를 어떻게 처리할 지에 대한 설정입니다.
-
CASCADE : 이와 연결되어 있는 모든 N 쪽 데이터를 삭제합니다.
-
PROTECT : 1인 쪽의 데이터가 삭제가 되지 않도록 보호해줍니다.
-
SET_NULL : null 로 값을 대체하게 되어 필드에 null=True 옵션이 있어야만 가능합니다.
-
SET_DEFAULT : default 로 값을 대체하게 되어 필드에 default=True 옵션이 있어야만 가능합니다.
-
SET : 대체할 값이나 함수를 지정합니다.
-
DO_NOTHING : 아무 것도 하지 않지만 db 에서 오류가 발생할 수 있습니다.
GET vs. POST
GET: Data is requested from a specific resource
- Not for password or some sensitive information to be sent to the server
- GET은 서버로부터 정보를 조회하기 위해 설계된 메소드입니다.
POST: Data is submitted to be processed to a specific resource
- Data sent by the POST method goes through HTTP header so security depends on the HTTP protocol.
- POST 요청은 GET과 달리 대용량 데이터를 전송할 수 있습니다.
When to use
- GET은 설계원칙에 따라 서버의 데이터나 상태를 변경시키지 않아야 Idempotent하기 때문에 주로 조회를 할 때에 사용해야합니다. 예를 들어, 브라우저에서 웹페이지를 열어보거나 게시글을 읽는 등 조회를 하는 행위는 GET으로 요청하게 됩니다.
- POST는 서버의 상태나 데이터를 변경시킬 때 사용됩니다. 게시글을 쓰면 서버에 게시글이 저장이 되고, 게시글을 삭제하면 해당 데이터가 없어지는 등 POST로 요청을 하게 되면 서버의 무언가는 변경되도록 사용됩니다. 이처럼 POST는 생성, 수정, 삭제에 사용할 수 있지만, 생성에는 POST, 수정은 PUT 또는 PATCH, 삭제는 DELETE가 더 용도에 맞는 메소드라고 할 수 있습니다.
as_view
-
In Class-based views, you have to call as_view() function so as to return a callable view that takes a request and returns a response. Its the main entry-point in request-response cycle in case of generic views.
-
as_view is the function(class method) which will connect my MyView class with its url.
auto_now = True
수정일자; django model이 save될 때마다 현재날짜로 갱신됩니다. (Just like "last-modified")
auto_now_add = True
생성일자; django model이 최초 저장 시에만 현재날짜를 적용합니다. (Just like "last-posted)
on_delete in FOREIGNKEY
모델 A 와 모델 B가 N:1 관계일 때, 모델A에 on_delete=models.CASADE 구문이 설정되어있으면, 모델 B의 어떤 레코드가 삭제되면 삭제될 모델 B의 레코드와 관련있는 모델 A의 레코드들도 연차적으로 삭제됩니다. 만약, on_delete가 설정되어 있지 않으면, 모델 B의 레코드를 참조하고 있는 다른 모델의 레코드가 있기 때문에 삭제할 수가 없게 됩니다. CASCADE의 의미를 어떤 행위를 직접적으로 지시받지 않았으나, 연관된 어떤 모델이 받은 행위에 같은 영향(행위)을 받게 한다는 것으로 생각하시면 됩니다.
data = json.loads(request.body)
http의 데이터가 있으면, body에 있는 데이터를 긁어와야함. 근데 이 데이터는 문자열이기 때문에, 파이썬이 제대로 읽을 수가 없다. 그래서, json.loads이라는 표현으로 딕셔너리형태로 변환해준다. 그래서 data의 email이나 user_id 같은 데이터의 접근할 때, data['user_id'] 같이 key로 value로 접근하는 것이다.
장고에서 get과 filter의 차이
Basically use get() when you want to get a single unique object, and filter() when you want to get all objects that match your lookup parameters.
- filter쓸때는 .exists 써줌.
ForeignKey는 child에 지정하는것이 좋다.
many-to-many관계에서 ForeignKey는 lower level에 지정하는 것이 좋다. 예) class Movie and class Character. One movie can have many characters and many characters can be in one movie. In such case, Character should have a FK.