💣 time attack
🔎 장고 심화 문법에 대해 이해하기
-
- article에 serializers.py 파일에 ModelSerializer를 사용해 시리얼라이저를 생성하고 Article 모델을 지정해주세요
-
- article 앱의 의 views.py에 APIView를 사용해 get / post 요청을 받을 수 있는 ArticleView 클래스를 만들고
-
- 프로젝트 urls에 /api/article/ 경로로 접속했을 때 article의 urls를 호출하도록 설정하고, article의 urls.py에 ‘’ 경로로 접속했을 때 ArticleView를 호출하도록 설정해주세요
-
- ArticeView에 post 요청을 받으면 serializer를 사용해 로그인 한 사용자를 author로 지정하고 게시글을 생성할 수 있도록 해주세요
-
- ArticeView에 get 요청을 받으면 serializer를 사용해 모든 게시글 목록을 리턴하도록 해주세요
-
- postman으로 테스트를 진행해주세요
💡 알게된 것
from django.contrib.auth.models import User
from django.contrib.auth import get_user_model
get_user_model
을 사용하는 게 커스텀유저를 사용하게 되어도 바꿔줄 게 없어서 편리함
- verbose_name = '작성자'
author = models.ForeignKey(User, verbose_name = '작성자', on_delete=models.CASCADE)
- @api_view (from rest_framework.decorators import api_view)
함수형 뷰를 사용할 때 사용... 이번 타임어택땐 클래스형 뷰 사용함 ⭐⭐
- author 지정하는 방법
1) article.save(author=request.user)
➡ .is_valid() 에서 걸려서 저장이 안됨
➡ 시리얼라이저 fields에서 author를 빼주면 가능
2) read-only 속성주기
➡ extra_kwargs = 'author':{'read-only': True }
3) SerializerMethodField 사용하기
➡ User = serializers.SerializerMethodField()
def get_author(self, obj)
return obj.author.username
❌ 오류
- 로그인하는데 get으로 하려고함 ^.^
urlpatterns = [path('', views.ArticleView.as_view(), name='articleview'),]
➡ 뒤에 as_view()가 있으니까 views를 또 붙여서 views.ArticleView.as_view()로 할 필요도 없고 하면 안된다...................! ⭐⭐⭐
- 포스팅한게 하나도 없어서 get 요청 보냈더니 아무것도 안뜬거였다 희희..
- post 요청이 안됨 not null constraint failed 오류남
save안에 author=request.user를 넣으면 해결! 들어간 인자가 없어서 오류남
def post(self, request):
serializer = ArticleSerializer(data=request.data)
if serializer.is_valid():
serializer.save(author=request.user)
return Response(serializer.data)
else:
return Response(serializer.errors)
🍋 사물인식 프로젝트 코드리뷰 4일차
🔎 팔로우 기능
-
user모델 필드에 following을 추가했는데 /admin 페이지에 following 필드가 생성이 안됨
user/admin.py에 유저모델은 원래 등록되어있어서 당연히 생성이 될 거라고 생각했는데
admin.site.register(User,UserAdmin)
에서 UserAdmin이 뒤에 추가되어있어서 UserAdmin 설정이 오버라이드 돼서 필드가 생기지 않음
➡ UserAdmin을 지우거나 그대로 두려면 admin.site.register 윗단에 UserAdmin.fieldsets += (("custom", {"fields": ("following",)}), ) 추가해줘도 생성됨!
-
symmetrical=False
자동으로 맞팔하게 되는 기능 끄기
🎃 장고 심화 4주차 6강 ~ 끝!
🍭 알게 된 것
- 게시글 수정시엔
id=article_id
인 조건이 있으니까 시리얼라이져에서 many=True조건이 필요없다
- drf에서
get_object_or_404
모듈은 restframeworks.generics
에서 임포트해야한다
elated_name
은 역참조시 사용되는데 기본값이 소문자모델명_set
이고, 이렇게 쓰게되면 모델에서 따로 설정해줄 필요가 없다
- 벨리데이션 후에 나머지 값을 넣어주면 돼서 지난번 타임어택 퀴즈때도 그렇고 save시에 따로 벨리데이션을 거치치 않고싶은 값들을
user= request.user
처럼 save()
함수 안에 넣어주면 된다
- 게시글 생성은 처음에 불러올 데이터 없이 시리얼라이져로 시작된다 불러올 데이터가 없으니깐
- 댓글 생성은 기존 게시글의 아이디를 받아와야해서 시리얼라아져 뒤에 article_id=artice_id 라는 조건을 붙인다. 게시글 생성과 마찬가지로 시리얼라이져로 시작하면 되는데, 혹시 원한다면... 게시글을 받아와도 상관은 없다.. 아래 오류 참조!
- 수정시 serializer(기존값(첫줄에서 불러온값), data=request.data)이렇게 쓰면 되고 기존 값에 밸리데이션을 거치지 않고 저장하고 싶었던 값들이 이미 저장되어있기때문에 수정할 부분만 수정하고 save()안에는 따로 그런 값들이 들어갈 필요가 없다 걍
save()
!
- comment_set으로 user이름을 email로 불러오기
comment_set 필드는 CommentSerializer가 적용되는 부분 ➡ user이름을 email로 받아오고 싶단말이지
like 갯수를 카운트하려면 시리얼라이즈에서 likes_count 를 serializermethodfield
로 새롭게 정의해주면 된다 그리고 fields에 꼭 추가할 것!
likes_count = serializers.SerializerMethodField()
def get_likes_count(self, obj):
return obj.likes.count()
- users/admin.py 에서 UserAdmin-list_display에서 모델 리스트에서 표시되는 항목을 바꿀 수 있다
- users/admin.py 에서 UserAdmin-fieldsets 에서 followings가 목록에 뜨게 할 수 있다
근데 왜 그래야되지 원래는 모델 변경하고 마이그레이션 마이그레이트만 해주면 자동으로 다 떴는데??? 아까 likes도 그냥 떴잖아❓❓❓
그 후에 models.py에서 팔로잉 필드가 필수가 되지 않도록 blank=True 추가!
🍭 오류
- SyntaxError: positional argument follows keyword argument
class CommentView(APIView):
def post(self, request, article_id):
article = get_object_or_404(Article, id=article_id)
serializer = CommentCreateSerializer(data= request.data)
if serializer.is_valid():
serializer.save(user=request.user, article)
➡ 이렇게 써서 틀림 save안에 넣어주는 값들은 뭐 = 뭐 형식이어야 하나봄
serializer.save(user=request.user, article=get_object_or_404(Article, id=article_id))
➡ 수정
- "Comment.user" must be a "User" instance
로그인하지 않은채로 댓글을 달려고 하면 나는 오류