본문 바로가기
프로그래밍/파이썬

django.db에 데이터 추가하기

by laoching 2022. 7. 9.
728x90
반응형

장고로 api를 만들던 도중 데이터를 추가하는 방법에 대해 써본다.

 

models.py 소스는 아래와 같다.

# models.py
from django.db import models

# Create your models here.
class Product(models.Model):
    name = models.CharField(max_length = 70)
    price = models.IntegerField()
    created_at = models.DateTimeField(auto_now_add = True)

    def __str__(self):
        return self.name

 

ORM 사용하기

Django ORM - 인코덤, 생물정보 전문위키 (incodom.kr)

 

Django ORM - 인코덤, 생물정보 전문위키

# Django ORM

www.incodom.kr

ORM에 대한 설명은 위의 사이트를 참고한다.

sql 쿼리 없이 파이썬으로 db를 사용할 수 있게 해주는 기능이라고 이해했다.

 

django shell 접근하기

ORM을 이용하기 위해서는 py -3 manage.py shell 명령어로 장고 쉘로 접근해준다.

그냥 python이나 ipython과 달리 환경변수 설정이 잘 되어있다고 한다.

앞에 >>>으로 변경되었죠?

 

데이터 추가하기

추가할 품목 이름 = 클래스명(속성=값, 속성2=값, ...)

추가할 품목 이름.save()

 

내 코드에서는 Product라는 클래스에 name과 price를 설정해주어야 하기 때문에 실제 아래와 같은 코드를 써줬다.

>>> samdasu = Product(name = 'samdasu', price = 1000)
>>> samdasu.save()

근데 아래와 같은 에러가 발생했다.

Traceback (most recent call last):
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\sqlite3\base.py", line 477, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such table: product_product

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\base.py", line 806, in save    
    self.save_base(
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\base.py", line 857, in save_base
    updated = self._save_table(
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\base.py", line 1000, in _save_table
    results = self._do_insert(
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\base.py", line 1041, in _do_insert
    return manager._insert(
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\query.py", line 1434, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\sql\compiler.py", line 1621, in execute_sql
    cursor.execute(sql, params)
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\utils.py", line 103, in execute
    return super().execute(sql, params)
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\utils.py", line 67, in execute
    return self._execute_with_wrappers(
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\utils.py", line 80, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    with self.db.wrap_database_errors:
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\utils.py", line 91, in __exit__       
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\wjdtk\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\sqlite3\base.py", line 477, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: product_product

 

나는 migrate를 하지 않아서 생겼던 오류였다.

py -3 manage.py makemigrations
py -3 manage.py migrate

 

migrate를 해주고 다시 django shell에 들어가서 데이터를 추가해주었다.

그리고 추가한 samdasu의 id를 확인해보았다.

그리고 페이지에서도 samdasu라는 녀석이 추가되었고 price도 입력한대로 들어간 것을 확인했다.

pepsi라는 녀석도 추가해줘봤다.

 

db만 구성한다면 웹 페이지에서 gui를 통해 데이터 추가가 가능하다.


API를 이용하여 데이터 확인하기
# views.py

from django.shortcuts import render
from rest_framework.response import Response
from .models import Product
from rest_framework.views import APIView
from .serializers import ProductSerializer
# Create your views here.

class ProductListAPI(APIView):
    def get(self, request):
        queryset = Product.objects.all()
        print(queryset)
        serializer = ProductSerializer(queryset, many = True)
        return Response(serializer.data)
# urls.py

"""gugudan_api URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from product.views import ProductListAPI

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/product', ProductListAPI.as_view())
]

127.0.0.1:8000/api/product로 들어가면 ProductListAPI 클래스를 as_view 메소드를 이용하여 접근한다.

postman으로도 접속해보고 브라우저 상에서도 들어가봤다.

 

728x90
반응형

댓글