[Django] clone instagram #3

์ •๋ณด๊ตฌ๋‹ˆยท2021๋…„ 11์›” 30์ผ
0

Django

๋ชฉ๋ก ๋ณด๊ธฐ
11/15
post-thumbnail

์ด์ œ๋ถ€ํ„ฐ ์‹ค์ œ๋กœ ์ž‘๋™์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ฐฑ์—”๋“œ ๋ถ€๋ถ„์„ ๋งŒ์ ธ๋ณด๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.

ORM


๋””๋น„์˜ ์˜ค๋ฆฌ์ง€๋„ ๋ฐฉ์‹์„ ๋จผ์ € ์•Œ์•„๋ณด์ž.

๋””๋น„ ๋งŒ๋“ค๊ณ  ์ฝ”๋“œ ๋”ฐ๋กœ ๋งŒ๋“ค๊ณ  ์กฐํšŒํ•˜๋Š” ๊ฒƒ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ํ™”๋ฉด์— ๋ณด์—ฌ์ค€๋‹ค.
์—ฌ๊ธฐ์„œ ์กฐํšŒํ• ๋•Œ๋Š” SQL์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ฆ‰, ์˜ค๋ฆฌ์ง€๋„ ๋ฐฉ์‹์€ ์ฝ”๋“œ์—์„œ ๋””๋น„๋ฅผ selectํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„์šฐ๊ณ  ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

์˜ค๋ฆฌ์ง€๋„ ๋ฐฉ์‹์—์„œ๋Š” ์ฝ”๋“œ์—์„œ ๋ณ€์ˆ˜(name,age,gender,email)์— ๋Œ€ํ•ด ๋ชจ๋‘ ์„ ์–ธ์„ ํ•ด์ฃผ๊ณ , ๋””๋น„์—์„œ๋„ (์ด๋ฆ„,๋‚˜์ด,์„ฑ๋ณ„,์ด๋ฉ”์ผ)์„ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ์˜ค๋ฆฌ์ง€๋„ ๋ฐฉ์‹์—์„œ ๋””๋น„์— ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค„ ๊ฒฝ์šฐ,
์ฝ”๋“œ์—์„œ ์ถ”๊ฐ€ํ•ด์ฃผ์ง€ ์•Š์•˜์„ ๋•Œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ˆ„๋ฝ๋˜๋Š” ์ผ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.
์ „ํ™”๋ฒˆํ˜ธ๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฝ”๋“œ์—์„œ๋„ phone์ด๋ผ๊ณ  ์ด์ค‘์ž‘์—…์„ ํ•ด์ค˜์•ผํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ์ด์ค‘์ž‘์—…์„ ํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ๋•Œ๋ฌธ์— ORM์ด๋ผ๋Š” ๋ฐฉ์‹์ด ์ƒ๊ธฐ๊ธฐ ์‹œ์ž‘ํ•œ ๊ฒƒ์ด๋‹ค.


๊ทธ๋Ÿผ ORM๋ฐฉ์‹์€ ๋ฌด์—‡์ด ๋‹ค๋ฅผ๊นŒ?

ORM์€ ๊ฐ์ฒด(object)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋””๋น„๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

์ฝ”๋“œ์—์„œ class user ๋ผ๋Š” ๊ฐ์ฒด์— ์ด๋ฆ„,๋‚˜์ด,์„ฑ๋ณ„,์ด๋ฉ”์ผ์„ ๋งŒ๋“ค์–ด ์ฃผ๋ฉด
ORM์ด db์™€ object๋ฅผ ์ž๋™์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•ด์ค€๋‹ค.
๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ†ตํ•ด ๋””๋น„์—๋Š” ์ฝ”๋“œ์— ์žˆ๋Š” object ๊ทธ๋Œ€๋กœ user๋ผ๋Š” ํ…Œ์ด๋ธ”์— ์ €์žฅ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€๋‚˜ ์ˆ˜์ •์‚ฌํ•ญ์ด ์žˆ์–ด๋„ ์ฝ”๋“œ์™€ ๋””๋น„๊ฐ€ ์ž๋™์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜๊ธฐ๋•Œ๋ฌธ์—
์–‘์ชฝ์„ ๋ชจ๋‘ ๊ด€๋ฆฌํ•  ํ•„์š”์—†์ด ์ฝ”๋“œ๋งŒ ๊ด€๋ฆฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋˜ํ•œ ORM์€ sql์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ORM์ด ์•Œ์•„์„œ ์ฝ”๋“œ๋ฅผ sql๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
์žฅ๊ณ ์—์„œ๋Š” ์ด๊ฒƒ์„ '์ฟผ๋ฆฌ์…‹'์ด๋ผ๊ณ  ํ•œ๋‹ค.



DB ๊ตฌ์ƒํ•˜๊ธฐ


๊ทธ๋Ÿผ ์ด์ œ ํ”ผ๋“œ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.

ORM์€ object๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋””๋น„๋ฅผ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ object๊ฐ€ ๋ฌด์—‡์ผ์ง€ ์ƒ๊ฐํ•ด๋ด์•ผ ํ•œ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์‰ฝ๊ฒŒ ์—‘์…€ํ˜•์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ํ•˜๋‚˜์˜ column(์—ด)์— ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค



๋‹ค์Œ ํ”ผ๋“œ์™€ ๋Œ“๊ธ€์˜ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ตฌ์ƒํ•ด๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

>> ํ”ผ๋“œ table <<
ํ”„๋กœํ•„์‚ฌ์ง„ | ๊ธ€์“ด์ด์•„์ด๋”” | ์‚ฌ์ง„ | ๊ธ€๋‚ด์šฉ


>> ๋Œ“๊ธ€ table <<
๋Œ“๊ธ€๋‚จ๊ธด์‚ฌ๋žŒ | ๋Œ“๊ธ€๋‚ด์šฉ

ํ”ผ๋“œ๋ฅผ ๋ณด์—ฌ์ค„ ๋•Œ ๋Œ“๊ธ€๊นŒ์ง€ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด,
์ฒซ๋ฒˆ์งธ ํ”ผ๋“œ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์ฒซ๋ฒˆ์งธ ํ”ผ๋“œ๋ฅผ ๊ทธ๋ ค์ค€ ๋‹ค์Œ,
๋Œ“๊ธ€ ํ…Œ์ด๋ธ”์—์„œ ํ”ผ๋“œid๋ฅผ 1๋กœ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ํ™”๋ฉด์— ๊ทธ๋ ค์ฃผ๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ ํ”ผ๋“œ๋ฅผ ๊ทธ๋ฆฌ๋Š”๋ฐ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋งŒ์ด ํ•„์š”ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ…Œ์ด๋ธ”์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์—ฌ๋Ÿฌ๊ฐœ์˜ ํ…Œ์ด๋ธ”์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ณ ์œ ํ•œ id๊ฐ’์„ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋กœ ์—ฐ๊ฒฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

db์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ณ ์œ id๊ฐ’์œผ๋กœ
Primary key(๊ธฐ๋ณธํ‚ค)์™€ Foreign key(์™ธ๋ž˜ํ‚ค)๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.


์„œ๋น„์Šค์— ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ตฌ์กฐ ์ฆ‰, ํ…Œ์ด๋ธ”์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”์ง€ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์—
์›ํ•˜๋Š” ์„œ๋น„์Šค๊ฐ€ ์–ด๋–ค๊ฑด์ง€, ์–ด๋– ํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š”์ง€๋ฅผ ์ž˜ ์•Œ์•„์•ผ ๋””๋น„์˜ ํ…Œ์ด๋ธ”์„ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•  ๊ฒƒ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.



models ๋งŒ๋“ค๊ธฐ


๋””๋น„๋ฅผ ๊ตฌ์ƒํ•ด๋ณด์•˜์œผ๋‹ˆ ์‹ค์ œ๋กœ ์ฝ”๋“œ์— ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค.

- content/models.py

class Feed(models.Model):  # Feed๋ผ๋Š” ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ
    profile = models.TextField()  # ํ”„๋กœํ•„์‚ฌ์ง„    
    user_id = models.TextField()  # ์‚ฌ์šฉ์ž์•„์ด๋””
    image = models.TextField()    # ์‚ฌ์ง„
    content = models.TextField()  # ๊ธ€๋‚ด์šฉ
    like_count = models.IntegerField()  # ์ข‹์•„์š”์ˆ˜

์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด,
TextField()์™€ ๊ฐ™์ด ๋””๋น„์— ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์–ด๋–ค ๋ฐ์ดํ„ฐํ˜•์‹์„ ํ‘œ์‹œํ•˜๋Š”์ง€ ์ •์˜ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.


์ด๋ ‡๊ฒŒ Feed๋ผ๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋‹ค์„ฏ๊ฐœ์˜ ํ•„๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์ค€ ๋’ค, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•ด์ค€๋‹ค.

(venv) python manage.py makemigrations

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•ด์ฃผ๋ฉด ์žฅ๊ณ ์—์„œ ์ž๋™์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ models์— ์„ ์–ธํ•œ ํด๋ž˜์Šค(๊ฐ์ฒด)๋ฅผ ๋ชจ๋‘ ์ฐพ์•„์„œ ๋””๋น„๋กœ ๋งŒ๋“ค์–ด์ค„ ์ž‘์—…์„ ํ•˜๊ฒŒ๋œ๋‹ค.


(venv) python manage.py migrate


๊ทธ๋Ÿผ ๋””๋น„์— content_feed๋ผ๋Š” ํ…Œ์ด๋ธ”๋กœ ์œ„์—์„œ ๋งŒ๋“ค์–ด์ค€ 5๊ฐœ์˜ ํ•„๋“œ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ  ์ถ”๊ฐ€๋กœ id๋ผ๋Š” ๊ณ ์œ ๊ฐ’์ด ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค.



views ๋งŒ๋“ค๊ธฐ


models.py๋กœ DB๋ฅผ ๋งŒ๋“ค์–ด ์คฌ์œผ๋ฉด, ์ด์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ „๋‹ฌํ•ด์ค„์ง€ views๋ฅผ ๋งŒ๋“ค์ค˜์•ผ ํ•œ๋‹ค.

-content/views.py

from .models import Feed

class Main(APIView):
    def get(self, request):
        feed_list = Feed.objects.all()
                
        return render(request, "instagram/main.html", context=dict(feed_list=feed_list))

์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•ด๋ณด์ž๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • feed_list = Feed.objects.all()
    :Feed ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค
  • return render(request, "instagram/main.html", context=dict(feed_list=feed_list))
    : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„์„œ instagram/main.html์— ๋ณด๋‚ด์ค€๋‹ค.

์ด๋ ‡๊ฒŒ ๋ทฐ์—์„œ๋Š” ๋””๋น„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋ณด๋‚ด์ฃผ๊ฒŒ ๋œ๋‹ค.



url ์—ฐ๊ฒฐํ•˜๊ธฐ


main/์ด๋ผ๋Š” url์„ ๋ฐ›์•˜์„ ๋•Œ ๋ฐฉ๊ธˆ์ „ ๋ทฐ์—์„œ ๋งŒ๋“ค์–ด์ค€ Main์„ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ url.pyํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์ค€๋‹ค.

- instagram/urls.py

from content.views import Main 

urlpatterns = [
    path('admin/', admin.site.urls),
    path('main/', Main.as_view())
]

url์„ ์„ค์ •ํ•ด์คŒ์œผ๋กœ์จ main/์ด๋ผ๋Š” url์„ ํƒ€๊ณ  ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ content ์•ฑ์— ์žˆ๋Š” views์˜ Main์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.



ํ…œํ”Œ๋ฆฟ์— ๋ฐ์ดํ„ฐ ๋„ฃ์–ด์ฃผ๊ธฐ


๋ทฐ๋กœ๋ถ€ํ„ฐ ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํ…œํ”Œ๋ฆฟ์— ์ ์šฉ์‹œ์ผœ์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค.

๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํ…œํ”Œ๋ฆฟ์— ์ ์šฉ์‹œ์ผœ ์ค„๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

{% for feed in feed_list %}
  <p>{{ feed.id }}</p>
  <p>{{ feed.image }}</p>
  <p>{{ feed.content }}</p>
  <p>{{ feed.profile_image }}</p>
  <p>{{ feed.user_id }}</p>
  <p>{{ feed.like_count }}</p>
{% endfor %}

๋ฐ˜๋ณต๋ฌธ์ด ์‹œ์ž‘ํ•˜๋Š” ์ง€์ ์— {% for feed in feed_list %}์„ ๋„ฃ์–ด์ฃผ๊ณ , ๋ฐ˜๋ณต๋ฌธ์ด ๋๋‚˜๋Š” ์ง€์ ์— {% endfor %}๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๊ฐ’์„ ๋„ฃ์–ด์ค„ ๊ณณ์— {{ feed.ํ•„๋“œ์ด๋ฆ„ }}์„ ๋„ฃ์–ด์ฃผ๋ฉด, ์•Œ์•„์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š” ๊ฐ’๋“ค์ด ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค.

์ด๊ฒƒ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ด์ „์— ์ž‘์„ฑํ•ด์ค€ main.htmlํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

- templates/instagram/main.html

...
<!-- ํ”ผ๋“œ๋ฐ•์Šค ์‹œ์ž‘ -->
{% for feed in feeds %}
<div class="feed-box">
    <div class="profile">
        <div class="profile-img-box">
            <img class="profile-img"
                src=" {{ feed.profile }} ">
        </div>
        <div class="profile-id">
            {{ feed.user_id }}
        </div>
    </div>

    <div class="feed-img">
        <img id="feed-img"
            src=" {{ feed.image }} ">
    </div>

    <div class="icon">
        <div>
            <span class="material-icons-outlined">favorite_border</span>
            <span class="material-icons-outlined">chat_bubble_outline</span>
            <span class="material-icons-outlined">send</span>
        </div>
        <div>
            <span class="material-icons-outlined">bookmark_border</span>
        </div>
    </div>

    <div class="like">
        django <b>์™ธ {{ feed.like_count }}๋ช…</b>์ด ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค
    </div>

    <div class="feed-text">
        <b>{{ feed.user_id }}</b> {{ feed.content }}
    </div>

    <div class="comment">
        <div> <b>๊ธฐ๋•</b> ์žฅ๊ณ  ํ™”์ดํŒ… </div>
        <div> <b>์žฌ๋ช…</b> ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ™”์ดํŒ… </div>
        <div> <b>์ด์„ฑ</b> ํŒŒ์ด์ฌ ํ™”์ดํŒ… </div>
    </div>

    <div class="input-comment">
        <input id="input-comment" type="text" class="form-control" placeholder="๋Œ“๊ธ€ ๋‹ฌ๊ธฐ...">
    </div>
</div>
{% endfor %}

์ด๋•Œ ํ•œ๊ฐ€์ง€ ์ˆ˜์ •ํ•ด์ค˜์•ผํ•  ๋ถ€๋ถ„์ด ์žˆ๋‹ค.
์ง€๊ธˆ์€ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ”ผ๋“œ ์•„๋ž˜์— ์ƒ๊ธฐ๊ณ  ์žˆ๋‹ค.

์›๋ž˜๋Š” ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ์ตœ์‹ ๊ธ€๋กœ ์ƒ๋‹จ์— ๋– ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ˆ˜์ •ํ•ด์ค˜์•ผํ•œ๋‹ค.

๊ฐ€์žฅ ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ์˜ id๊ฐ’์ด ๊ฐ€์žฅ ํด ๊ฒƒ์ด๋‹ค.
์›๋ž˜๋Š” ๋ทฐ์—์„œ ๋””๋น„๋ฅผ ๊ฐ€์ ธ์˜ฌ๋•Œ id๊ฐ’์ด ์ž‘์€๊ฑฐ ๋ถ€ํ„ฐ
์ฆ‰, 1 >> 2 >> 3๋ฒˆ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ์ˆœ์„œ๋ฅผ ์—ญ์ˆœ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ฒŒ ์ˆ˜์ •ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

- content/veiws.py

class Main(APIView):
    def get(self, request):
        feed_list = Feed.objects.all().order_by('-id')

        return render(request, "instagram/main.html", context=dict(feeds=feed_list))

  • .order_by('-id') : id๊ฐ’์ด ํฐ๊ฒƒ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ด

์ด๋ ‡๊ฒŒ ์ˆ˜์ •ํ•œ ๋’ค ์„œ๋ฒ„๋ฅผ ๋Œ๋ฆฌ๋ฉด ์ตœ์‹ ๊ธ€์ด ์ตœ์ƒ๋‹จ์— ์˜ฌ๋ผ์˜ค๋„๋ก ์ˆ˜์ •๋œ ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.



๐Ÿ”Ž ์ฐธ๊ณ 
๊ฐ•์˜
๊ฐ•์˜์ž๋ฃŒ

0๊ฐœ์˜ ๋Œ“๊ธ€