Django CRUD (2)


CRUD(2)は、HTTP通信によりクライアントからサーバに要求を送信し、Djangoアプリケーションにより分析要求と処理要求の論理(View)を実行し、データベースと通信(Model)を行い、データ操作を実行し、対応する応答を実現するBackend APIである.

モデルの作成



適切なモデルを得るには、次のERDを参照してください.pyを記述し、データベースにバインドします.
from django.db import models

# Create your models here.
class Owner(models.Model):
    name = models.CharField(max_length=20)
    email = models.CharField(max_length=45)
    age = models.IntegerField(default=0)

    class Meta:
        db_table = 'owners'

class Dog(models.Model):
    name = models.CharField(max_length=20)
    age = models.IntegerField(default=0)
    owner = models.ForeignKey('Owner', on_delete=models.CASCADE)

    class Meta:
        db_table = 'dogs' 

Models.py作成後、マイグレーションファイルを作成して適用し、Mysqlデータベースが正しく関連付けられていることを確認します.

ビューの作成


モデルの作成が完了し、要求を処理するためにViewが作成されます.

POST

import json

# from django.shortcuts import render
from django.http    import JsonResponse
from django.views   import View

from owners.models  import Owner, Dog

# Create your views here.
class OwnerView(View):   
    def post(self, request):
        try:
            data  = json.loads(request.body)
            owner = Owner.objects.create(
                name  = data['name'],
                email = data['email'],
                age   = data['age']
            )
            return JsonResponse({'message':'created'}, status=201)

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

class DogView(View):
    def post(self, request):
        data = json.loads(request.body)
        owner = Owner.objects.get(name=data['owner'])
        dog = Dog.objects.create(
            name = data['name'],
            age = data['age'],
            owner = owner
        )

        return JsonResponse({'message':'created'}, status=201)
postメソッドは,飼い主の3種類の情報と子犬の3種類の情報をそれぞれ要求する機能を実現した.

GET

class OwnerView(View): 
	def get(self, request):
        owners = Owner.objects.all()

        results = [{
            "name"  : owner.name,
            "email" : owner.email,
            "age"   : owner.age,
            "dogs"  : [{
                "name" : dog.name,
                "age"  : dog.age
            } for dog in owner.dog_set.all()]
        } for owner in owners]


        # results = []

        # for owner in owners:
        #     # dogs = Dog.objects.filter(owner=owner)
        #     dogs = owner.dog_set.all()
        #     dog_list = []

        #     for dog in dogs:
        #         dog_list.append(
        #             {
        #                 "name" : dog.name,
        #                 "age" : dog.age
        #             }
        #         )
        #     results.append(
        #         {
        #             "name" : owner.name,
        #             "email" : owner.email,
        #             "age" : owner.age,
        #             "dog" : dog_list
        #         }
        #     )

        return JsonResponse({'results':results}, status=200)
        
class DogView(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({'reults':results}, status=200)
GETメソッドによる
マスターリスト(名前、電子メール、年齢、飼い犬リスト)
子犬のリスト(名前、年齢、飼い主の名前を含む)
そこから情報を取得する機能を実現した.
問題は、1:Nのownerとdogのownerがdogを参照する場合、親テーブルで逆参照する場合に逆参照を使用できることです.
オブジェクト.モデル名setのフォーマットを使用します.ownerです.dog setを使用してownerテーブルでdogテーブルを参照します.
また,二重for文を用いたためコードが長くなり,指導者はlist理解を用いてコード長を短縮しようと試みたが,確かにコード長が短くなるにつれて簡潔に見えるようになり,今後はできるだけlist理解を用いてコードを記述するようになった.

URLconf


ビューが作成された以上、クライアントからの要求をURLで受信して適切なビューをマッピングできるようになりました.pyの作成
# owners/urls.py
from django.urls  import path

from owners.views import OwnerView, DogView

urlpatterns = [
    path('/owners', OwnerView.as_view()),
    path('/dogs', DogView.as_view()),
]

# wecrud/urls.py
from django.urls import path, include

urlpatterns = [
    path('owners', include('owners.urls')),
]
urlマッピングも完了し、サーバを実行しhttpieにリクエストを送信します.
http -v POST 127.0.0.1:8090/owners/owners name='John' email='[email protected]' age=28
http -v POST 127.0.0.1:8090/owners/dogs name='해피' owner='John' age=10
http -v GET 127.0.0.1:8090/owners/owners
http -v GET 127.0.0.1:8090/owners/dogs