iT邦幫忙

2023 iThome 鐵人賽

DAY 1
0
自我挑戰組

Django系列 第 15

Day15~Django 漫漫長路-使用多個database 取出資料

  • 分享至 

  • xImage
  •  

大家好,我是Leo
今天要來講解,在很多情況下可能不只使用一個db,這樣我們要如何設定及如何使用/images/emoticon/emoticon30.gif
OK~~~ Let's go now!!!


setting設定檔

default 是預設的資料庫,server這名字是一個自訂義的名字,使用上待會會在views內說明,也可以不只增加一個database,可以建立多個關聯,如雲端GCP SQL..等等,自訂義名字不重複,且一定要存在預設資料庫也就是default。

DATABASES = {
    'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': '127.0.0.1',
            'PORT': '3306',
            'NAME': 'mydb',
            'USER': 'root',
            'PASSWORD': 'root',
    },

    'server': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'INSERT INTO YOUR DATABASE IP',
        'PORT': 'INSERT INTO YOUR DATABASE PORT',
        'NAME': 'INSERT INTO YOUR DATABASE NAME',
        'USER': 'INSERT INTO YOUR USER',
        'PASSWORD': 'INSERT INTO YOUR PASSWORD',
    },

}

Models

假設我們server內有一個tableName叫doggle,如下圖:

https://ithelp.ithome.com.tw/upload/images/20230202/20154853tJWN2bzoLM.jpg

我們該如何撰寫model,因在models內的model會加上appname:"website_"在table name前面,該如何避免此情況發生。

models/doggle_model.py

from django.db import models

class Doggle(models.Model):
    id = models.AutoField(primary_key=True)
    sex = models.CharField(max_length=255)
    age = models.IntegerField()
    breed = models.CharField(max_length=255)
    color = models.CharField(max_length=255)
    class Meta:
        db_table = "doggle"
        managed = False

db_table 指定table name
managed = False 不生成新的table (預設會生成)


views

veiws/doggle.py

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import permissions
from website.models import Doggle
from website.serializers import DoggleSerializer

class DoggleAPIView(APIView):
    permission_classes = (permissions.AllowAny,)
    authentication_classes = []

    def post(self, request):
        doggle = Doggle.objects.using('server').all()
        serializer_doggle = DoggleSerializer(
            doggle, many=True, context={"request": request}
        )

        return Response(serializer_doggle.data)

model.objects.using('server') 要使用哪個資料庫
也可以同時呼叫好幾個database
甚至也可以將db_table當變數使用

views/init.py

from .doggle import *

serializers

serializers/doggle_ser.py

from rest_framework import serializers
from website.models import Doggle

class DoggleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Doggle
        fields = "__all__"

serializers/init.py

from .doggle_ser import *

urls.py

from django.urls import path
from website.views import DoggleAPIView

path('api/doggle/list',DoggleAPIView.as_view(),name='api-doggle')

今天透過model.objects.using(name) -> name需在setting先設置 的方式,就可以同時使用好幾個不同的database甚至不同的ip address,可以從多個db整合資料在使用restframe method將data資訊呈現出來,明天我們要來講解,如果當今天dbtable是一個變數,我們要如何設置與使用
我們明天見,各位掰掰~~~/images/emoticon/emoticon29.gif


上一篇
Day14~Django 漫漫長路- 入木三分serializer-part2
下一篇
Day16~Django 漫漫長路-當tableName 成為變數
系列文
Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言