TIL C.R.U.D 2 정리

박준영·2021년 5월 27일
0

C.R.U.D 2에서는 R에 대해서 다루었고 post를 이용해 body를 만들고 get으로 정보를 가져오는 수업을 진행했습니다.

post
각 기능을 서로 다른 클래스로 구현해주세요.
1. 신규 주인 등록
2. 강아지 등록(주인정보 필요)

Get
1. 주인 리스트(이름, 이메일, 나이 포함)
2. 강아지 리스트(이름, 나이, 주인 이름 포함)
3. 주인 리스트(1번 코드에 추가, 이름, 나이 포함, 키우는 강아지 리스트(이름 ,나이))


models.py
class Owner(models.Model):
	name  = models.CharField(Max_lengh=45)
	email = models.CharField(Max_lengh=300)
	age   = models.IntegerField()
    
    class Meta:
    	db_table = 'owners'
        
class Dog(models.Model):
	owners = models.Foreignkey(Owner, on_delet=models.CASCADE)
	name   = models.CharField(Max_lengh=45)
	age    = models.IntegerField()
    
    class Meta:
    	db_table = 'dogs'

models.py 해석
1. 각각의 owners, dogs에 맞는 class를 만들어주었습니다.

  1. name, email, age 등을 만들어 주었고, 테이블을 보면 주인과 강아지가 one to many로 붙잡혀 있기에 dogs에 owners의 foreignkey를 지정해 주었습니다.

views.py에서 get, post를 지정해주어야 합니다.

views.py
class OwnerListView(View):
    def get(self, request):
        owners = Owner.objects.all()
        
        result1  = []
        
        for owner in owners:

            dogs  = owner.dog_set.all()
            result10 = []
            
            for dog in dogs:

                list1 = {'dog_name': dog.name, "dog_age": dog.age}

                result10.append(list1)
                
            result3 = {'name': owner.name},{'email': owner.email}, {'age': owner.age}, {'dogs':result10}
            result1.append(result3)
        return JsonResponse({'result': result1}, status=200)

    def post(self, request):
        try:
            data   = json.loads(request.body)
            Owner.objects.create(name=data['name'], email=data['email'], age=data['age'])
            return JsonResponse({'result': 'SUCCESS'}, status=201)

        except KeyError:
            return JsonResponse({'message' : 'INVELID_KEY'}, status=400)

class DogListView(View):
    def get(Self, request):
        dogs    = Dog.objects.all()
        result2 = []
        
        for dog in dogs:
            owners  = Owner.objects.get(name=dog.owners.name)
            result4 = {'name' : dog.name}, {'age': dog.age}, {'owner': owners.name}
            result2.append(result4)
        return JsonResponse({'result': result2}, status=200)

    def post(self, request):
        try:
            data   = json.loads(request.body)
            owner  = Owner.objects.get(name=data['owner']) # name=data['front key 값 아무 내용 가능']
            Dog.objects.create(name=data['name'], age=data['age'], owners=owner)
            return JsonResponse({'result': 'SUCCESS'}, status=201)
        
        except KeyError:
            return JsonResponse({'message' : 'INVELID_KEY'}, status=400)
        except Owner.DoesNotExist:
            return JsonResponse({'message' : 'USER DOES NOT EXIST'}, status=404) # get 들어있다면 except 2개 해줘야한다.

                    
         

설명
1. 첫번째 클래스 지정한 후 post를 만들어서 값을 넣어주었습니다.

  • data는 json으로 바디에 값을 넣어주었습니다.
  • Owner.objects.create(name=data['name'], email=data['email'], age=data['age']를 작성해주며 직접 값을 넣어줄수있게 해주었습니다.
  • try except문을 이용하면서 keyerror가 발생하면 invelid_key라는 메세지를 받을 수 있게 설정해 주었습니다.
  • owner = Owner.objects.get(name=data['owner'])를 적어 주며 포린키를 적어주었습니다.
  1. owners get을 할때는 강아지쪽에 주인의 포린키가 있기 때문에 역참조를 이용하여 강아지 이름이랑 나이를 추가했습니다.

새롭게 배운거나 추가 내용

  • 역참조는 dosg = owener.dog_set.all() 이처럼 _set을 이용해서 역참조 한다는점을 알게 되었습니다.
  • 처음 해보는 작업이었기에 urls.py설정과 import form작업이 중요하다는점을 알게 되었습니다.
  • post는 create해줘야 하기 때문에 status = 201을 활용할 수 있게 되었고, get은 Ok = success 이라는 점에서 200을 활용하게 되었습니다.

0개의 댓글