코딩 농장/웹 프로그래밍

[Django] DB와 연결해서 피드 글 띄우기

GreenBNN 2024. 4. 6. 23:21

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 안에 있는걸 바로 쓸 수 있다.