오늘의 코드 [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)
urlpatterns에 users앱과 articles앱의 경로를 지정한 후 각 앱의 urls.py로 이동하도록 include 함수 포함, static과 media의 url과 root 또한 지정해 줄 것
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와 ArticleListSerializer를 class로 작성하기도 한다. Fields 에는 표시하고자 하는 변수들을 선택적으로 정할 수 있다.
이후 DRF 복습 내용 이어서 정리할 예정입니다.
'스파르타코딩 AI웹개발 3기' 카테고리의 다른 글
| 내일배움캠프_TIL_2022.11.02 (0) | 2022.11.04 |
|---|---|
| 내일배움캠프_TIL_2022.11.01 (0) | 2022.11.01 |
| 내일배움캠프_WIL_2022.10.30 (0) | 2022.10.31 |
| 내일배움캠프_TIL_2022.10.28 (0) | 2022.10.29 |
| 내일배움캠프_TIL_2022.10.27 (0) | 2022.10.28 |