기존에 있던 Comment 모델에 필요한 필드들을 추가했다. 이때 기존 DB 데이터를 유지하기 위해 새로 추가되는 필드들은 null을 허용하도록 설정했다.
어제 DB를 날려먹은 뼈아픈 기억..
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="comments")
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
null=True,
blank=True
)
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True, null=True)
updated_at = models.DateTimeField(auto_now=True, null=True)
class Meta:
ordering = ['-created_at']
def __str__(self):
return f"Comment by {self.author or 'Anonymous'} on {self.post}"
댓글의 목록 조회와 작성을 위한 API 엔드포인트를 구현했다.
# urls.py
urlpatterns = [
path("posts/<int:post_id>/comments/", views.comment_list_create, name="comment_list_create"),
path("comments/<int:pk>/", views.comment_detail, name="comment_detail"),
]
# views.py
@require_http_methods(["GET", "POST"])
def comment_list_create(request, post_id):
post = get_object_or_404(Post, id=post_id)
if request.method == "GET":
comments = Comment.objects.filter(post=post).select_related('author')
data = [{
'id': comment.id,
'message': comment.message,
'author': comment.author.username if comment.author else 'Anonymous',
'created_at': comment.created_at.isoformat(),
} for comment in comments]
return JsonResponse({'comments': data})
elif request.method == "POST":
if not request.user.is_authenticated:
return JsonResponse({'error': '로그인이 필요합니다.'}, status=401)
try:
data = json.loads(request.body)
message = data.get('message', '').strip()
if not message:
return JsonResponse({'error': '댓글 내용을 입력해주세요.'}, status=400)
comment = Comment.objects.create(
post=post,
author=request.user,
message=message
)
return JsonResponse({
'id': comment.id,
'message': comment.message,
'author': comment.author.username,
'created_at': comment.created_at.isoformat(),
}, status=201)
except json.JSONDecodeError:
return JsonResponse({'error': '잘못된 요청입니다.'}, status=400)
이거 전에 올린 거 같은데? 라고 생각하신다면, 그것이 정답입니다.
어제 DB를 날려먹은 죄로,,,
사용자 프로필 수정 페이지 접근 시 다음과 같은 에러가 발생하는 것을 발견.
django.contrib.auth.models.User.profile.RelatedObjectDoesNotExist: User has no profile.
accounts/signals.py 파일을 수정하여 User 생성 시 자동으로 Profile이 생성되도록 구현,,, 하였다기보다는 주석처리 해놨던 부분을 원복.
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from .models import Profile
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance, nickname=instance.username)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
try:
instance.profile.save()
except Profile.DoesNotExist:
Profile.objects.create(user=instance, nickname=instance.username)
from django.apps import AppConfig
class AccountsConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "accounts"
def ready(self):
import accounts.signals
이거는 코드가 그대로 잘 남아 있어서 확인 정도만 하고 넘어감.
Django shell을 사용하여 기존 사용자들의 누락된 프로필을 생성하였다.
# Django shell 실행
python manage.py shell
# shell에서 실행한 코드
from django.contrib.auth.models import User
from accounts.models import Profile
for user in User.objects.all():
Profile.objects.get_or_create(user=user, defaults={'nickname': user.username})
흙흙 정상 작동 감사합니다...