1. 클라이언트 준비
$ brew install httpie
$ http -v method(POST, GET 등) 127.0.0.1:8000/[url 경로] key1="value1" key2="value2" key3="value3"
👉 request 보낼 시 띄어쓰기, 쉼표, 따옴표 등에 주의하여 한다. 첫 요청시 습관적으로 쉼표와 띄어쓰기(등호양옆)를 추가하여 에러가 발생하였다.
❗ 내가 보낸 잘못된 요청의 예시
$ http -v method(POST, GET 등) 127.0.0.1:8000/[url 경로] key1 = "value1", key2 = "value2"
2. models 구현
from django.db import models
class Owner(models.Model):
name = models.CharField(max_length=45)
email = models.CharField(max_length=300)
age = models.IntegerField(default=0)
class Meta:
db_table = 'owners'
class Dog(models.Model):
owner = models.ForeignKey('Owner', on_delete=models.CASCADE)
name = models.CharField(max_length=45)
age = models.IntegerField(default=0)
class Meta:
db_table = 'dogs'
$ python manage.py makemigrations
$ python manage.py migrate
3. Views 구현(클래스형 view)
👉 POST method와 GET method의 로직을 처리할 수 있는 View class를 구현하였다.
class OwnersView(View):
def post(self, request):
data = json.loads(request.body)
owner = Owner.objects.create(
name = data['name'],
email = data['email'],
age = data['age'],
)
return JsonResponse({'MESSAGE' : 'SUCCESS'}, status = 201)
class DogsView(View):
def post(self, request):
data = json.loads(request.body)
dog = Dog.objects.create(
name = data['name'],
age = data['age'],
owner = Owner.objects.get(name=data['owner'])
)
return JsonResponse({'MESSAGE' : 'SUCCESS'}, status = 201)
class GetOwners(View):
def get(self, request):
owners = Owner.objects.all()
results = []
for owner in owners:
dogs = Dog.objects.filter(owner=owner).values('name','age')
dog_list = []
for dog in dogs:
dog_list.append(dog)
results.append(
{
"name" : owner.name,
"email" : owner.email,
"age" : owner.age,
"dog" : dog_list
}
)
return JsonResponse({'RESULTS' : results}, status = 200)
class GetDogs(View):
def get(self, request):
dogs = Dog.objects.all()
results = []
for dog in dogs:
results.append(
{
"name" : dog.name,
"age" : dog.age,
"owner" : dog.owner.name
}
)
return JsonResponse({'RESULTS' : results}, status = 200)
4. url 맵핑
#Main urls.py
from django.urls import path, include
urlpatterns = [
path('ownersdogs/', include('ownersdogs.urls')),
]
# App내 urls.py
from django.urls import path
from ownersdogs.views import GetDogs, GetOwners, OwnersView, DogsView
urlpatterns = [
path('owners', OwnersView.as_view()),
path('dogs', DogsView.as_view()),
path('getowner', GetOwners.as_view()),
path('getdog', GetDogs.as_view()),
]
✅ 요청 성공 Message
👉 습관적으로 콤마(,)를 삽입하여 데이터에 그대로 삽입되는 현상이 나타났다. httpie를 이용한 요청을 할 때는 헷갈리지 않도록 주의를 기울여야 겠다.
👉 Database에 잘 저장된 것을 확인 할 수 있다.
📝 Feedback
데이터 저장시 콤마(,)가 들어가지 않도록 주의 한다.
class 이름은 단수 명사형으로 사용하도록 한다. (OwnersView -> OwnerView)
Owner테이블에 접근해서 데이터를 처리 하는 기능은 같은 클래스에 두는 것이 좋다.
# ex)
class OwnerView(view):
def post(self, request):
...
def get(self, request):