장고로 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)
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으로도 접속해보고 브라우저 상에서도 들어가봤다.
'프로그래밍 > 파이썬' 카테고리의 다른 글
파이썬 함수에서 return (0) | 2023.08.24 |
---|---|
selenium을 이용한 웹 페이지 자동화 구현 (0) | 2022.09.16 |
selenium으로 네이버 열기 (0) | 2022.07.08 |
unittest를 이용한 코드 테스트 (0) | 2022.07.07 |
파이썬 int형 리스트를 join을 이용하여 출력하기 (0) | 2022.06.11 |
댓글