1028 TIL

looggi·2022년 10월 28일
0

스파르타 내배캠 AI-3

목록 보기
50/130
post-thumbnail

💣 time attack

🔎 장고 심화 문법에 대해 이해하기

    1. article에 serializers.py 파일에 ModelSerializer를 사용해 시리얼라이저를 생성하고 Article 모델을 지정해주세요
    1. article 앱의 의 views.py에 APIView를 사용해 get / post 요청을 받을 수 있는 ArticleView 클래스를 만들고
    1. 프로젝트 urls에 /api/article/ 경로로 접속했을 때 article의 urls를 호출하도록 설정하고, article의 urls.py에 ‘’ 경로로 접속했을 때 ArticleView를 호출하도록 설정해주세요
    1. ArticeView에 post 요청을 받으면 serializer를 사용해 로그인 한 사용자를 author로 지정하고 게시글을 생성할 수 있도록 해주세요
    1. ArticeView에 get 요청을 받으면 serializer를 사용해 모든 게시글 목록을 리턴하도록 해주세요
    1. postman으로 테스트를 진행해주세요

💡 알게된 것

  • 내장 usermodel 사용하기
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
    로그인하지 않은채로 댓글을 달려고 하면 나는 오류
profile
looooggi

0개의 댓글