class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
from rest_framework import serializers
from articles.models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
from rest_framework.response import Response
from .serializers import ArticleSerializer
from rest_framework.decorators import api_view
from .models import Article
# Create your views here.
@api_view(('GET','POST'))
def index(request):
# GET 요청시 article 객체 모두 response
if request.method == 'GET':
articles = Article.objects.all()
serializer = ArticleSerializer(articles,many=True)
return Response(serializer.data)
# (json 형식으로) POST 요청시 생성된 article 객체 response
elif request.method == 'POST':
serializer = ArticleSerializer(data = request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
- 시리얼라이즈란?
DB data -> JSON
- 시리얼라이저란?
각 모델 인스턴스를 model_to_dict 과정이 없이 쉽게 직렬화할 수 있게 해주는 것
https://velog.io/@ifyouseeksoomi/DRF-Django-REST-Framework-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%98%88%EC%8A%B5-Serializer
💡 알게된 것
@login_required(login_url='user:signin')
def post_detect(request):
if request.method == "POST":
temp_img = TempImg()
temp_img.image = request.FILES.get('before_image') # 과일(재료)사진
print(temp_img.image)
# post_pics/바나나_7ByoVY9.PNG
temp_img.save() #요건 해줘야함
img_url = temp_img.image #url
context = pick_img(request,img_url)
# 사물인식 결과 Saved 1 image to runs\detect\exp48
ing_list = Dessert() ##
ing_list = Dessert.objects.filter(ingred=context['picked'])
rand_pick = random.choice(ing_list) #같은 과일로 만든 디저트들 중에 하나 랜덤으로 골라서
context['dess_image'] = rand_pick.image
context['dess_id'] = rand_pick.id
context['dess_name'] = rand_pick.dessert_name
context['dess_ingred'] = rand_pick.ingred
print('--------------------------',context)
#-------------------------- {'picked': 'banana', 'dess_image': <ImageFieldFile: dessert_pics/바나나팬케이크.jpg>, 'dess_name':'바나나팬케이크','dess_ingred':'banana'}
return render(request, 'post/post_create.html', context)
➡ 컨텍스트를 이렇게 만들면 구성을 자유자재로 할 수 있는 것 같음 객체를 만들면 걔는 모델에 있는 칼럼을 모두 채워줘야하는데(failed notnullconstraint) 얘는 랜더링할 때 쓸 것만 뽑아서.. ⭐⭐⭐⭐⭐ 이게............................... 칼럼 값을 모두 채워야하는게 아니라 칼럼 값중에 null값이 있으면 안된단 뜻인가 아니 근데 그게 그거아닌가...??
➡ if you do not specify null=True, blank=True, it becomes a required field.
When creating or updating the database, Django is constrained to find a default value to fill the field, because Null=False by default. It does not find any because you haven't defined any.
➡ 담에는 이름을 좀 잘 지어야겠다 왜 ing_list가 됐었는지 모르겠다 그래서 나중에 코드 보는데 더 헷갈린듯 erd할 때부터 나중에 바꾸면 되지~ 하지말고 직관적으로 잘 지어야겠다 dess_list로 바꿔야징
random 함수 - 반환값은 모두 리스트!
POST는 프론트에서 보내준(request) 이미지를 이미지로 불러올 수 없고 경로만 저장이 된다/ FILES는 이미지로 불러올 수 있다 & enctype = multi~ 가 없으면 이미지 파일 확장자가 이상하게 저장이 된다 rff??
게시글 만들 때 POST, FILES로 가져오되, 객체에 따로 저장(save())하지말고 장고 내장함수 create를 쓸 수 있다
Post.objects.create(객체를 구성하는 요소(칼럼)가 모두 필요)
➡ To create and save an object in a single step, use the create() method.
When instantiating, Django doesn’t hit the database until you explicitly call save().
from blog.models import Blog
➡ b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
b.save() 안에 다 넣어줘버려도 되는거였군...!!
모델을 만들 때 class Meta 부분에 ordering을 주면 나중에 게시글 정렬 순서를 views.py에서 따로 orderd_by이런식으로 붙이지 않아도 된다
➡ context['posts'] = Post.objects.filter(author=user_id).order_by('-created_at')
이 경우를 말하는 것 같은데 메타에서 오더링하는 경우는 전체를 그 필드의 값을 기준으로 정렬하게 되는거라서 좀 다르지 않나..??? 흠흠흠흠흠 나는 그 필드 값만 정렬을 주고싶은건데 다른것도 그렇게되면 안되지않나
get_object_or_404 vs get_list_or_404
multiple objects returned 인 경우 후자를 사용
➡ func(Model혹은queryset, 필터링할 조건)
authenticate를 이용 ➡ 세션이 db에 생성되고 쿠키(공간)에 세션 정보가 전달돼서 전달
➡ stateless 하지 않다 : 세션이 남지 않으면 지속성이 떨어지고 db에 과부하 여러 기기로 한 계정으로 로그인하는 경우에 대응이 어려움
토큰을 사용
➡ 사용자의 정보가 담긴 토큰을 돌려보내주고 이걸 로컬스토리지에 저장
로컬스토리지는 만료일이 정해져있지 않다
많은 양의 데이터를 저장할 때 유리
프로젝트 파일에서 지정하는 방식? 이 더 간단하다(쿠키는 장고에서 알아서 authenticate를 통해서 저장)
pip install django djangorestframework djangorestframework-simplejwt
➡ 이렇게 여러개의 패키지를 동시에 설치할 수 있다
브라우저> 개발자도구 - application - storage에서 스토리지 확인 가능
포스트맨에서 로그인할때 꼭 비번은 스트링으로!!
제대로 로그인하면 access, refresh가 나옴
access 토큰은 기한후 만료 - 자동으로 로그아웃됨
access가 만료되면 refresh 토큰으로 access 재발급 가능 ➡ 보안상의 이유로 사용
토큰을 사용하면 장고에서 db를 찾아보지 않아도 된다
정보가 토큰에 있는지 db세션에 있는지가 가장 큰 차이!!!!!