[Django] C.R.U.D 2

Minjeong Bak·2021년 11월 10일
0

PYTHON/Django

목록 보기
13/14
post-thumbnail

세션 내용

View 구성

class ProductListView(View):
# (View) -> 장고가 제공해주는 View를 상속받는다는 뜻
    def get(self, request):
    # get요청을 보내려고 하면 함수명에 똑같이 get으로 적어줘야 함.
    
    # Client의 요청을 처리할 수 있는 Logic
    
    return
    

서버 연결 확인

python manage.py runserver

POST

목적 및 json.loads(request.body) 설명

import json

def post(self, request):
  '''
  함수의 목적: client의 상품 등록 요청에 맞게 database에 상품 정보 생성
  
  1. Input: Product 데이터(json)
  2. Output: 상품의 등록 여부 {"message" : "SUCCESS"}
  3. How: Input으로 들어온 상품 데이터를 ORM을 이용해서 database의 Product table에 Data 저장
         (1) json data -> python dictionary 변환
             {
                 "category_id" : 1,
                 "description" : "아주 맛있었어요",
                 "name" : "나이트로 바닐라 크림",
                 "price" : 5500
             }
         (2) Product.object.create(Input 데이터)
         (3) return {"message" : "SUCCESS"} (dictionary) -> json data 변환 후 저장
         함수의 request 파라미터를 계속 가지고 있는 이유
         : django post 요청이 들어올 때 body에 담아져 있는 json 데이터를 request 객체 안에 담아서 보내줌
         - 반드시 두번째 인자로 request를 받아야만 프론트로 부터 받은 요청을 처리할 수 있음
 '''
     print(f"request.body :: {request.body}")
     # request.body data -> 프론트에서 넘어온 데이터가 byte형식의 긴 string으로 전달됨
     
     input_data = json.loads(request.body)
     print(f"json_loaded input_data :: {input_data}")
     # json의 loads라는 함수에 돌려서 꺼내지면 python에서 사용할 수 있는 dictionary 형태로 변환되어 출력됨.

Product.objects.create()

def post(self, request):

    Product.objects.create(
        name = input_data["name"],
        price = input_data["price"],
        category_id = input_data["category_id"]
    )
    # input_data의 dictionary key값으로 접근

JsonResponse

def post(self, request):

    Product.objects.create(
        name = input_data["name"],
        price = input_data["price"],
        category_id = input_data["category_id"]
    )
    return JsonResponse({"message" : "SUCCESS"}, status = 201)
    # 데이터가 생성됐을 때는 status code 201

GET

목적

import json

def get(self, request):
  '''
  함수의 목적: client의 상품 정보 요청에 맞게 database에 상품 정보 호출 및 가공 후 상품 데이터 반환
  
  1. Input: 없음
  2. Output: 상품 목록
  result = [{
      "id" : 1,
      "name" : "A",
      "price" : 5000,
      "category" : {
          "id" : 1,
          "name" : "콜드브루"
      }
  },
  {
      "id" : 2,
      "name" : "B",
      "price" : 4000,
      "category" : {
          "id" : 1,
          "name" : "콜드브루"
      }
  },
  ...
  ]
  3. How: 
     Product 테이블의 모든 상품 데이터 조회.
     Product Instance 들을 python의 native한 data type인 dictionary로 변환해줘야 한다.
  '''

models.py

class Category(models.Model):
    name = models.CharField(max_length=20)
    image_url = models.CharField(max_length=200)
    
    class Meta:
        db_table = 'categories'
        
class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.IntegerField(default=0)
    category = models.ForeignKey(category, on_delete=models.CASCADE)
    
    class Meta:
        db_table = 'products'
  • Category가 Product의 id를 가지고 있는 것이 아니기때문에 Product가 가지고 있는 Category를 찾을 수 없다.

code


import json

def get(self, request):
    
    products = Product.objects.all()
    
    results = []
    
    for product in products:
        results.append(
        {
            "id" : product.id,
            "name" : product.name,
            "price" : product.price,
            "category" : {
                "id" : product.category.id # product는 category id를 foreignkey로 가지고 있음
                "name" : product.category.name
            }
        }
        )
        
    return JsonResponse({"products" : results}, status = 200)

공부해야 할 것

  • class 안 함수 self 인자
  • http request, response message 개념 재확인

0개의 댓글