본문 바로가기
스파르타코딩 AI웹개발 3기

내일배움캠프_TIL_2022.10.31

by 청귤에이드 2022. 11. 1.

오늘의 코드 [2022.10.31]

중요해서 반드시 기억할 필요가 있거나, 주의해야 코드를 답안 형식으로 주석(저의 코멘트) 함께 정리해 보았습니다.

 

Q. Django Rest Framework 개념 정리

 

articles/models.py

class Article(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE)

    title = models.CharField(max_length=50)

    content = models.TextField()

    image = models.ImageField(blank=True, upload_to='%Y/%m/')

    created_at = models.DateTimeField(auto_now_add=True)

    updated_at = models.DateTimeField(auto_now=True)

    likes = models.ManyToManyField(User, related_name="like_articles")

 

    def __str__(self):

        return str(self.title)

 

Article class 생성

 

[user] ForeignKey User 호출, on_delete=models.CASCADE

[image] upload_to='%Y/%m/'

[created_at] auto_now_add=True

[updated_at] auto_now=True

[likes] 좋아요는 ManyToManyField 적용

[def __str__(self)] 입력한 title article 제목에 반영하게 해준다.

 

article/admin.py

from django.contrib import admin

from articles.models import Article, Comment

 

admin.site.register(Article)

admin.site.register(Comment)

Article Comment 모델을 등록

 

 

 

drf_project/admin.py

from django.contrib import admin

from django.urls import path, include

from django.conf import settings

from django.conf.urls.static import static

 

urlpatterns = [

    path('admin/', admin.site.urls),

    path('users/', include("users.urls")),

    path('articles/', include("articles.urls")),

]

 

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

urlpatternsusers앱과 articles앱의 경로를 지정한 후 각 앱의 urls.py로 이동하도록 include 함수 포함, static media urlroot 또한 지정해 줄 것

 

 

article/serializers.py

class ArticleSerializer(serializers.ModelSerializer):

    user = serializers.SerializerMethodField()

    comments = CommentSerializer(many=True)

    likes = serializers.StringRelatedField(many=True)

 

    def get_user(self, obj):

        return obj.user.email

 

    class Meta:

        model = Article

        fields = '__all__'

comments likes 뒤에 many=True를 붙여주어야 오류를 피할 수 있다.

SerializerMethodField를 사용하는 이유는 get_user처럼 시리얼라이저의 인스턴스에도 매서드를 적용시키기 위함

 

class ArticleCreateSerializer(serializers.ModelSerializer):

    class Meta:

        model = Article

        fields = ("title","image","content")

 

class ArticleListSerializer(serializers.ModelSerializer):

    user = serializers.SerializerMethodField()

    likes_count = serializers.SerializerMethodField()

    comments_count = serializers.SerializerMethodField()

 

    def get_user(self, obj):

        return obj.user.email

 

    def get_likes_count(self, obj):

        return obj.likes.count()

 

    def get_comments_count(self, obj):

        return obj.comments.count()

 

    class Meta:

        model = Article

        fields = ("pk","title","image","updated_at","user", "likes_count", "comments_count")

 ArticleSerializer 를 보다 세부적으로 파악하기 위해 ArticleCreateSerializer ArticleListSerializerclass로 작성하기도 한다. Fields 에는 표시하고자 하는 변수들을 선택적으로 정할 수 있다.

 

이후 DRF 복습 내용 이어서 정리할 예정입니다.