[Django] DB와 연결해서 피드 글 띄우기
ORM(Object-Relational Mapping) : 애플리케이션 Class 와 RDB(Relational DataBase)의 테이블을 연결한다는 뜻이며 기술적으로는 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해준다.
원래는 DB 에서 SQL 을 이용해 조작했어야하는데 ORM 을 통해 Method 를 통해 바로바로 쓸 수 있다.
<ORM> 없다면
DB에 저장된 이름, 나이, 성별 --> SQL 사용 SELECT --> 코드에서 name, age, gender 에 값 저장해서 사용
<ORM> 있다면
양쪽이 연결되어 있으니까 DB 객체를 만들어서 그걸 바로 쓸 수 있고
저장이 DB 에 자동으로 된다. 또 코드를 SQL 쿼리셋으로 자동으로 바꾸어 데이터를 뽑아준다.
이제 Django 에서 DB 를 사용하기 위해서 content/migrations/models.py 에 코드를 작성해준다.
from django.db import models
# 게시물 테이블
class Feed(models.Model):
content = models.TextField() # 글 내용
image = models.TextField() # 피드 이미지
profile_image = models.TextField() # 프로필 이미지
user_id = models.TextField() # 글쓴이
like_count = models.IntegerField() # 좋아요 수
이렇게 작성해준 후 makemigrations 명령어를 치면
kimkeonhyeong@KeonHyeong-ui-MacBookAir jinstagram % python3 manage.py makemigrations
Migrations for 'content':
content/migrations/0001_initial.py
- Create model Feed
migrations/0001_initial.py 가 생긴다.
이 파일이 우리가 생성한 객체 DB 테이블들을 실제 데이터베이스에 테이블을 만들어주는 친구이다.
나중에 python3 manage.py migrate 실행하면 DB를 구축해준다.
# Generated by Django 5.0.4 on 2024-04-06 13:35
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Feed',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('content', models.TextField()),
('image', models.TextField()),
('profile_image', models.TextField()),
('user_id', models.TextField()),
('like_count', models.IntegerField()),
],
),
]
이제 구축한 데이터를 사용해보자
먼저 content/migrations/views.py 에 코드를 작성해준다.
from django.shortcuts import render
from rest_framework.views import APIView
from .models import Feed # Feed 객체 사용할꺼야
# Create your views here.
class Main(APIView):
def get(self, request):
feed_list = Feed.objects.all() # select * from content_feed
print(feed_list)
for feed in feed_list:
print(feed)
print("Get")
return render(request, "jinstagram/main.html", context=dict(feeds=feed_list))
여기서 이제 요청한 화면을 보내줄 때 html 파일을 넘겨주면서 context=dict(feeds=feed_list) 를 같이 넘겨주어 쓸 수 있게 해준다.
(나중에 main.html 에서 바로 쓸 수 있음)
기존에 우리는 urls.py 에서
views.py APIView > Sub 를 호출해서 화면을 띄었는데
이제 내용 측면에서 관리되는 view 를 띄우기 위해
/content/views.py APIView > Main 을 사용해서 화면을 띄울꺼다
urlpatterns = [
path('admin/', admin.site.urls),
# /views.py APIView > Sub
# /content/views.py APIView > Main
path('', Main.as_view()),
]
실행해보면 이제 feed_list = Feed.objects.all() 로 DB를 연결하고
print() 로 데이터가 제대로 찍히는걸 볼 수 있다.
이제 받아온 데이터로 main.html 게시물에 연결해 띄우면 된다.
<body>
<div>
{% for feed in feeds %}
<p>{{feed.content}}</p>
<p>{{feed.user_id}}</p>
<p>{{feed.like_count}}</p>
{% endfor %}
</div>
이렇게 feeds 안에 있는걸 바로 쓸 수 있다.