[drf]airbnb-api -2 pure django api

Hyeseongยท2021๋…„ 3์›” 22์ผ
0

django restframework airbnb api

๋ชฉ๋ก ๋ณด๊ธฐ
2/21
post-thumbnail

์‹œ์ž‘ํ•˜๊ธฐ ์•ž์„œ


Pipfile์ž…๋‹ˆ๋‹ค. ๊ด€๋ จ ํŒจํ‚ค์ง€๋“ค์ด ์ •์˜๋˜์–ด ์žˆ๋Š”๋ฐ์š”. ๊ฐ€๋ณ๊ฒŒ ๊น”์•„์ฃผ๊ณ  ์‹œ์ž‘ํ• ๊ฒŒ์š”.

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]
flake8 = "*"
black = "*"

[packages]
django = "*"
pillow = "*"
django-seed = "*"

[requires]
python_version = "3.7"

[pipenv]
allow_prereleases = true

๋ฃจํŠธ ์„ค์ • ํ™˜๊ฒฝ์—์„œ url์„ค์ •์ด ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ์š”. ์•„๋ž˜ ๋ฏธ๋””์–ด ํŒŒ์ผ์˜ ์œ„์น˜์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ •์˜์™€ endpoint๊นŒ์ง€ settings.py๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ ๋˜๋Š”๊ฒŒ ๋ณด์ด๋„ค์š”.

๊ด€๋ จ ์†Œ์Šค ์ฝ”๋“œ ๋ฐ ํŒŒ์ผ๋“ค์ด ์žˆ๋Š” ๊นƒํ—™ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค.
https://github.com/hyeseong-dev/2021-03-11_airbnb-api

config/urls.py

from django.contrib import admin
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path("admin/", admin.site.urls),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

๋น ๋ฅด๊ฒŒ models.py ์ฝ”๋“œ๋ฅผ ์ •์˜ ํ• ํ…๋ฐ์š”.

room์•ฑ

from django.db import models
from core.models import CoreModel


class Room(CoreModel):

    name = models.CharField(max_length=140)
    address = models.CharField(max_length=140)
    price = models.IntegerField(help_text="USD per night")
    beds = models.IntegerField(default=1)
    lat = models.DecimalField(max_digits=10, decimal_places=6)
    lng = models.DecimalField(max_digits=10, decimal_places=6)
    bedrooms = models.IntegerField(default=1)
    bathrooms = models.IntegerField(default=1)
    check_in = models.TimeField(default="00:00:00")
    check_out = models.TimeField(default="00:00:00")
    instant_book = models.BooleanField(default=False)
    user = models.ForeignKey(
        "users.User", on_delete=models.CASCADE, related_name="rooms"
    )

    def __str__(self):
        return self.name

    def photo_number(self):
        return self.photos.count()

    photo_number.short_description = "Photo Count"


class Photo(CoreModel):

    file = models.ImageField()
    room = models.ForeignKey(
        "rooms.Room", related_name="photos", on_delete=models.CASCADE
    )
    caption = models.CharField(max_length=140)

    def __str__(self):
        return self.room.name

user์•ฑ

from django.contrib.auth.models import AbstractUser
from django.db import models


class User(AbstractUser):

    avatar = models.ImageField(upload_to="avatars", blank=True)
    superhost = models.BooleanField(default=False)
    favs = models.ManyToManyField("rooms.Room", related_name="favs")

    def room_count(self):
        return self.rooms.count()

    room_count.short_description = "Room Count"

users/admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from . import models


@admin.register(models.User)
class UserAdmin(UserAdmin):

    fieldsets = UserAdmin.fieldsets + (
        ("Custom Profile", {"fields": ("avatar", "superhost",)},),
    )

    list_display = UserAdmin.list_display + ("room_count",)

users/admin.py

๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—์„œ ์ƒ์„ฑ๋œ ์œ ์ €๋“ค์„ GUI ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”.

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from . import models


@admin.register(models.User)
class UserAdmin(UserAdmin):

    fieldsets = UserAdmin.fieldsets + (
        ("Custom Profile", {"fields": ("avatar", "superhost",)},),
    )

    list_display = UserAdmin.list_display + ("room_count",)

settings.py ๋ณ€์ˆ˜ ์„ค์ • ๋ฐ ์•ฑ ๋“ฑ๋ก

...
...
...
DJANGO_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
]

PROJECT_APPS = [
    "core.apps.CoreConfig",
    "users.apps.UsersConfig",
    "rooms.apps.RoomsConfig",
]

THIRD_PARTY_APPS = []

INSTALLED_APPS = DJANGO_APPS + PROJECT_APPS + THIRD_PARTY_APPS


...
...
...

STATIC_URL = "/static/"

MEDIA_ROOT = os.path.join(BASE_DIR, "uploads")

MEDIA_URL = "/media/"


# Auth

AUTH_USER_MODEL = "users.User"

dummy data ์ƒ์„ฑ(feat. django-seed)

django-seed ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•˜์—ฌ dummy๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด์•ผ API ๊ฒฐ๊ณผ๋ฌผ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๋” ๋””ํ…Œ์ผํ•œ ๊ฒƒ๋“ค์€ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ  ํ•  ๊ฒŒ์š”.
https://docs.djangoproject.com/en/3.1/howto/custom-management-commands/

๊ฒฝ๋กœ core/management/commands/mega_seed.py

  • management ํด๋” ์•„๋ž˜ __init__.pyํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ฃผ์„ธ์š”.
  • commands ํด๋” ์•„๋ž˜์—๋„ __init__.pyํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ฃผ์„ธ์š”.
import random
from datetime import datetime
from django.core.management.base import BaseCommand
from django_seed import Seed
from users.models import User
from rooms.models import Room, Photo


class Command(BaseCommand):

    help = "It seeds the DB with tons of stuff"

    def handle(self, *args, **options):
        user_seeder = Seed.seeder()
        user_seeder.add_entity(User, 20, {"is_staff": False, "is_superuser": False})
        user_seeder.execute()

        users = User.objects.all()
        room_seeder = Seed.seeder()
        room_seeder.add_entity(
            Room,
            150,
            {
                "user": lambda x: random.choice(users),
                "name": lambda x: room_seeder.faker.street_address(),
                "price": lambda x: random.randint(0, 300),
                "beds": lambda x: random.randint(0, 5),
                "bedrooms": lambda x: random.randint(0, 3),
                "bathrooms": lambda x: random.randint(0, 5),
                "instant_book": lambda x: random.choice([True, False]),
                "check_in": lambda x: datetime.now(),
                "check_out": lambda x: datetime.now(),
            },
        )
        room_seeder.execute()

        rooms = Room.objects.all()
        for room in rooms:
            for i in range(random.randint(5, 10)):
                Photo.objects.create(
                    caption=room_seeder.faker.sentence(),
                    room=room,
                    file=f"room_photos/{random.randint(1, 31)}.webp",
                )
        self.stdout.write(self.style.SUCCESS(f"Everything seeded"))

์žฅ๊ณ  ์‹œ๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ๊ทธ๋ฆ‡์ธ ๋””๋น„๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ช…๋ น์–ด๋ฅผ ๋Œ๋ฆฌ๋Š”๊ฑฐ ์žŠ์ง€ ๋งˆ์„ธ์š”.


์Œฉ ์žฅ๊ณ ๋กœ API๋ฅผ ๋งŒ๋“ค ๋•Œ

์ผ๋ฐ˜์ ์ธ ์žฅ๊ณ  ๋ทฐ ๋กœ์ง!

core/views.py


from django.core import serializers
from django.http import HttpResponse
from rooms.models import Room


def list_rooms(request):
    data = serializers.serialize("json", Room.objects.all())
    response = HttpResponse(content=data)
    return response

confing/urls.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("rooms/", include("core.urls")),
]

if settings.DEBUG:

core/urls.py

from django.urls import path
from . import views

app_name = "core"

urlpatterns = [
	path("list", views.list_rooms)
]
profile
์–ด์ œ๋ณด๋‹ค ์˜ค๋Š˜ ๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜ ๋ณด๋‹ค ๋‚ด์ผ...

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