Django

Django 3주차 숙제_댓글 불러오기 쓰기 삭제하기_메서드

끈끈 2023. 4. 6. 00:26

 

tweet/models.py:

from django.db import models
from user.models import UserModel

class TweetModel(models.Model):
    class Meta:
        db_table = "tweet"

    author = models.ForeignKey(UserModel, on_delete=models.CASCADE)
    content = models.CharField(max_length=256)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class TweetComment(models.Model):
    class Meta:
        db_table = "comment"

    tweet = models.ForeignKey(TweetModel, on_delete=models.CASCADE)
    author = models.ForeignKey(UserModel, on_delete=models.CASCADE)
    comment = models.CharField(max_length=256)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

 

tweet/views.py:

@login_required #로그인한 사용자만 접근 가능
def detail_tweet(request, id): # 글, 댓글 불러오기
    if request.method == 'GET':
        user = request.user.is_authenticated # 사용자의 로그인 확인
        if user:
            content = TweetModel.objects.get(id=id) 
            comment = TweetComment.objects.filter(tweet_id=id) 
            return render(request, 'tweet/tweet_detail.html', {'tweet': content, 'comment': comment})
        else:
            return redirect('/sign-in')

@login_required
def write_comment(request, id): # 댓글 쓰기
    if request.method == 'POST': # 순서도 중요함
        my_tweet = TweetModel.objects.get(id=id) 
        my_comment = TweetComment()
        user = request.user
        my_comment.author = user
        my_comment.tweet = my_tweet
        my_comment.comment = request.POST.get('comment', '')
        my_comment.save()
        return redirect('/tweet/' + str(id)) # str

@login_required
def delete_comment(request, id): # 댓글 삭제하기
    my_comment = TweetComment.objects.get(id=id)
    my_comment.delete()
    return redirect('/tweet/' + str(my_comment.tweet_id)) # str

 

tweet/urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('tweet/', views.tweet, name='tweet'),
    path('tweet/delete/<int:id>', views.delete_tweet, name='delete-tweet'),
    path('tweet/<int:id>',views.detail_tweet,name='detail-tweet'), # 해당 번호의 트윗과 댓글들 읽어오기
    path('tweet/comment/<int:id>',views.write_comment, name='write-comment'), # 해당 id 트윗에 댓글 작성
    path('tweet/comment/delete/<int:id>',views.delete_comment, name='delete-comment'), # 해당 댓글 삭제
]

 


 

Django의 메서드

 

  • all() : 데이터 전부 가져오기
all_tweet = TweetModel.objects.all().order_by('-created_at') # 최신순으로 정렬

 

  • get() : 하나의 Row만을 가져오기
content = TweetModel.objects.get(id=id)
# TweetModel에서 id가 사용자의 id와 같은 데이터를 가져옴

 

  • filter() : 특정 조건에 맞는 Rows 가져오기
comment = TweetComment.objects.filter(tweet_id=id)
# TweetComment에서 comment의 fk인 tweet_id와 같은 값의 데이터를 가져옴

Django의 외래키 필드명에는 "_id"가 자동으로 추가된다 (재지정 가능)

https://docs.djangoproject.com/ko/4.1/intro/tutorial02/

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

  • exists() : 원하는 조건의 유무에 따라 True/False를 반환해준다

 

  • order_by() : 데이터를 키에 따라 정렬하기 (앞에 -가 붙으면 내림차순)
all_tweet = TweetModel.objects.all().order_by('-created_at') # 최신순으로 정렬

 

DELETE
my_comment = TweetComment.objects.get(id=id) # 삭제할 Row 객체를 가져온 후
my_comment.delete() # delete() 메서드 호출

 

UPDATE ?
my_comment = TweetComment.objects.get(pk=1) # id가 1인 TweetComment 객체를 가져온 후
my_comment.content = 'Hi!' # 변경할 필드 수정
my_comment.save() # save() 메서드 호출

 

Account.objects.create(user_account='ghi', password=5678)

 

Account(
	user_account='ghi',
    password=5678,
).save()