前提・実現したいこと
Django Restful API curlコマンドによる既存外部DBのUPDATEをしたいと考えております。
イメージとしては以下です。
ユーザースマートフォン→curl→APIサーバ→別サーバDB
curl ~コマンドをユーザーのスマートフォンなりPCなりで実行(ajaxなど)をし、別途立てているAPIサーバーに通信が行われ、さらに別途立てている既存のDBのテーブルを更新するというものです。
シンプルに以下既存外部DBのテーブルイメージです。
ユーザーIDとBlog記事の格納
ユーザーID | blog記事内容 | 他 |
---|---|---|
1 | きのう、公園へ花を摘みにでかけました。 | |
2 | これからTDLにでかけます。 | |
3 | 近所の野良猫がお腹を大きくしていました。 |
ユーザー2が投稿したblog文章を編集し、『これからTDLにでかけます。』を『これからTDSにでかけます。』に変更など。
環境
今はまだテスト環境ですが以下です。
OS:win10(今後linux)
言語:python
Framework:Django
DB:sqlite3(今後はpostgresqlかmysql)
行ったこと
参考にしたURL:Django REST Frameworkを使って爆速でAPIを実装する
Win10のAnacondaインストール
conda仮想環境構築
以下、(mysite_env) C:\work\last_django> のディレクトリにてスタート
cmd
1pip install django 2pip install djangorestframework 3pip install django-filter 4# プロジェクト作成 5django-admin startproject django_rest_framework_test 6cd django_rest_framework_test/ 7# アプリ作成 8python manage.py startapp blog
blog/models.py
python
1from django.db import models 2 3 4class User(models.Model): 5 name = models.CharField(max_length=32) 6 mail = models.EmailField() 7 8 9class Entry(models.Model): 10 STATUS_DRAFT = "draft" 11 STATUS_PUBLIC = "public" 12 STATUS_SET = ( 13 (STATUS_DRAFT, "下書き"), 14 (STATUS_PUBLIC, "公開中"), 15 ) 16 title = models.CharField(max_length=128) 17 body = models.TextField() 18 created_at = models.DateTimeField(auto_now_add=True) 19 updated_at = models.DateTimeField(auto_now=True) 20 status = models.CharField(choices=STATUS_SET, default=STATUS_DRAFT, max_length=8) 21 author = models.ForeignKey(User, related_name='entries', on_delete=models.CASCADE)
django_rest_framework_test/settings.py
python
1# blogを追記 2# Django Framework組み込みのため 'rest_framework'追記 3INSTALLED_APPS = [ 4 'django.contrib.admin', 5 'django.contrib.auth', 6 'django.contrib.contenttypes', 7 'django.contrib.sessions', 8 'django.contrib.messages', 9 'django.contrib.staticfiles', 10 'blog', 11 'rest_framework', 12]
cmd
1# migrationファイルを作る 2python manage.py makemigrations 3# migrationファイルを元にDBに反映する 4python manage.py migrate
cmd
1# admin用のユーザー作成 2python manage.py createsuperuser 3 Username (leave blank to use 'user'): dev 4 Email address: 5 Password: 6 Password (again): 7 Superuser created successfully.
blog/admin.py
python
1from django.contrib import admin 2 3from .models import User, Entry 4 5 6@admin.register(User) 7class UserAdmin(admin.ModelAdmin): 8 pass 9 10@admin.register(Entry) 11class Entry(admin.ModelAdmin): 12 pass
blog/serializer.py
python
1# coding: utf-8 2 3from rest_framework import serializers 4 5from .models import User, Entry 6 7 8class UserSerializer(serializers.ModelSerializer): 9 class Meta: 10 model = User 11 fields = ('name', 'mail') 12 13 14class EntrySerializer(serializers.ModelSerializer): 15 class Meta: 16 model = Entry 17 fields = ('title', 'body', 'created_at', 'status', 'author') 18
blog/views.py
python
1# coding: utf-8 2 3import django_filters 4from rest_framework import viewsets, filters 5 6from .models import User, Entry 7from .serializer import UserSerializer, EntrySerializer 8 9 10class UserViewSet(viewsets.ModelViewSet): 11 queryset = User.objects.all() 12 serializer_class = UserSerializer 13 14 15class EntryViewSet(viewsets.ModelViewSet): 16 queryset = Entry.objects.all() 17 serializer_class = EntrySerializer
django_rest_framework_test/urls.py
python
1# coding: utf-8 2 3from django.conf.urls import url, include 4from django.contrib import admin 5 6from blog.urls import router as blog_router 7 8urlpatterns = [ 9 url(r'^admin/', admin.site.urls), 10 # blog.urlsをincludeする 11 url(r'^api/', include(blog_router.urls)), 12]
blog/urls.py
python
1# coding: utf-8 2 3from rest_framework import routers 4from .views import UserViewSet, EntryViewSet 5 6 7router = routers.DefaultRouter() 8router.register(r'users', UserViewSet) 9router.register(r'entries', EntryViewSet)
cmd
1python manage.py runserver
blog投稿をGUIによる行い、
http://localhost:8000/api/entries/
実行で
行き詰っているところ 質問
このAPIはあくまでdjangoによるDB作成(今回はsqlite3)をしているものに対してUPDATEやSELECTを行っているのですが、既存にすでにある別サーバのDBのテーブルをUPDATEする場合、そのサーバの接続情報とDBのIDPWを用意した場合、常にAPIサーバ側に同じDBを作成(migrate)しリアルタイム同期することで当初の要望が実現するのでしょうか。
Django REST frameworkでトランザクションしたい
この方が行っている事と同じようなものなのかと考えていますが、その場合、非常に多くのユーザーのアクセスやUPDATEがある場合、リアルタイムに整合性を保つことができるのか悩んでおります。
そもそも、外部のDBを操作する場合、このdjangoの同期の方法ではなく、DB情報さえあれば他の方法でAPIにより操作できる最良最速の方法などご存じあれば教えて頂けないでしょうか。よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/10 01:24
2021/06/10 06:49 編集
2021/06/11 09:06 編集
2021/06/11 09:47
2021/06/11 12:27 編集
2021/06/12 06:51 編集
2021/06/12 14:27 編集
2021/06/12 22:18
2021/06/14 23:37