from django.db import models
from django.db.models.deletion import CASCADE
from django.db.models.fields import DateTimeField
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=10)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
class Comment(models.Model):
article = models.ForeignKey(Article, on_delete=CASCADE)
content = models.CharField(max_length=200)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.content
def comments_create(request, pk):
article = get_object_or_404(Article, pk=pk)
comment_form = CommentForm(request.POST)
if comment_form.is_valid():
comment = comment_form.save(commit=False) # commit=False를 하면 db에 저장이 안됨. instance만 생성
comment.article = article
comment.save()
return redirect('articles:detail', article.pk )
(commit=False)
를 하면 instance는 생성되지만 db에는 저장이 안된다 만약 ForeignKey 인스턴스를 abcd로 생성 했다면 abcd_id로 만들어짐
하지만 명시적인 모델 관계 파악을 위해 참조하는 클래스 이름의 소문자(단수형)로 작성하는 것이 바람직 하다 (1:N)
CASCADE
: 부모 객체가 삭제 됐을 때 이를 참조하는 객체도 삭제 (게시글이 삭제 되면 해당 게시글에 달려있던 댓글들도 다 삭제됨) PROTET
: 부모를 삭제 할 때, 참조 되는 객체가 하나라도 있으면 부모 삭제 불가(댓글을 다 삭제하고 나서 게시글 삭제 가능)SET_NULL
: Foregin Key를 Null로 바꿔줌SET_DEFAULT
: 부모가 삭제 되면 FK에 디포트 값을 넣어줌SET
: DO_NOTHING
: 아무것도 안함RESTRICT
: 참조하는 테이블만 PROTECT처럼 동작을 하고 나머지는 일반적으로 삭제 가능article.commet
형태로 사용할 수 없고, article.comment_set_manager
가 생성 됨 (comment 모델이기 때문에)article
은 comment
가 있을수도 있고, 없을수도 있음# articles/views.py
from .models import Article, Comment
def detail(request,pk):
article = get_object_or_404(Article, pk=pk)
comment_form = CommentForm()
comments = article.comment_set.all()
context = {
'article' : article,
'comment_form' : comment_form,
'comments' : comments,
}
return render(request, 'articles/detial.html', context)
# articles/urls.py
urlpatterns = [
path('<int:article_pk>/comments/<int:comment_pk>/detail/',
views.comments_delete, name='comments_delete'),
]
# articles/views.py
@required_POST
def comments_delete(request, article_pk, comment_pk):
if request.user.is_authenticated: # 인증된 사용자만 삭제 가능
comment = get_object_or_404(Comment, pk=comment_pk)
comment.delete()
return redirect('articles:detail', article_pk)