Django CRUD (2)
CRUD(2)は、HTTP通信によりクライアントからサーバに要求を送信し、Djangoアプリケーションにより分析要求と処理要求の論理(View)を実行し、データベースと通信(Model)を行い、データ操作を実行し、対応する応答を実現するBackend APIである.
適切なモデルを得るには、次のERDを参照してください.pyを記述し、データベースにバインドします.
Models.py作成後、マイグレーションファイルを作成して適用し、Mysqlデータベースが正しく関連付けられていることを確認します.
モデルの作成が完了し、要求を処理するためにViewが作成されます.
マスターリスト(名前、電子メール、年齢、飼い犬リスト)
子犬のリスト(名前、年齢、飼い主の名前を含む)
そこから情報を取得する機能を実現した.
問題は、1:Nのownerとdogのownerがdogを参照する場合、親テーブルで逆参照する場合に逆参照を使用できることです.
オブジェクト.モデル名setのフォーマットを使用します.ownerです.dog setを使用してownerテーブルでdogテーブルを参照します.
また,二重for文を用いたためコードが長くなり,指導者はlist理解を用いてコード長を短縮しようと試みたが,確かにコード長が短くなるにつれて簡潔に見えるようになり,今後はできるだけlist理解を用いてコードを記述するようになった.
ビューが作成された以上、クライアントからの要求をURLで受信して適切なビューをマッピングできるようになりました.pyの作成
モデルの作成
適切なモデルを得るには、次の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
Reference
この問題について(Django CRUD (2)), 我々は、より多くの情報をここで見つけました https://velog.io/@cghy4862/Django-CRUD-2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol