皆さん、こんにちは。
今日は、PythonのウェブフレームワークDjangoで作成したREST APIを公開するので是非使ってみてください。
APIの概要
このAPIはコールセンターをイメージしたDBを構成し、CRUD操作(Create,Read,Update,Delete)を可能にしたAPIです。
もう一つにトークン認証でログインしたユーザーのみアクセスできるAPIもあります。
そちらは、81番ポートからアクセスしてください。今回はトークン認証の不要なAPIのみ紹介します。
使えるAPI
利用可能なAPI
http://172.104.81.40/api/
このURL(URI)にアクセスすると、下記のように各URLからAPIにアクセスできます。
"office": "http://172.104.81.40/api/office/", "staff": "http://172.104.81.40/api/staff/", "tickets": "http://172.104.81.40/api/tickets/", "ticket-categories": "http://172.104.81.40/api/ticket-categories/", "company": "http://172.104.81.40/api/company/", "store": "http://172.104.81.40/api/store/", "customer-contact": "http://172.104.81.40/api/customer-contact/"
Office:オフィス情報のAPIです。
Staff:従業員のAPIです。Officeの情報が紐づいています。
Tickets:お客様からのコール情報に他のテーブル(スタッフ、店舗情報、チケットカテゴリ)が紐づいています。
Ticket-Categories:コールのカテゴリ情報です。
Company:企業情報です。
StoreS:各企業の店舗情報です。
Customer-contact:お客様の連絡先です。
Djangoセットアップの手順
下記のURLにソースコードがアップロードされているので自由にクローンして使ってください。
https://github.com/TraitOtaku/Django-TicketAppAPI
Gitを使ってクローンからセットアップまでの手順です。
git clone https://github.com/TraitOtaku/Django-TicketAppAPI.git cd Django-TicketAppAPI virtualenv env bin\Scripts\activate pip install -r requirements.txt python manage.py makemigrations python manage.py migrate python manage.py createsuperuser python manage.py runserver
モデルの内容
各アプリのmodels.pyを参照して受け入れるデータタイプとデータが必須かどうかを確認してください。
blank=True, null=Trueの場合はデータがなしでもOKです。
class Ticket(models.Model): category = models.ForeignKey( TicketCategory, on_delete=models.PROTECT, related_name="category_name") created_by = models.ForeignKey( 'members.Member', on_delete=models.PROTECT, blank=True, null=True, default=None, related_name='ticket_created_by') updated_by = models.ForeignKey( 'members.Member', on_delete=models.PROTECT, blank=True, null=True, default=None, related_name='ticket_updated_by') ticket_date = models.DateTimeField(blank=True, null=True) is_open = models.BooleanField(default=False) is_email = models.BooleanField(default=False) complete_by = models.DateField(blank=True, null=True) open_details = models.CharField(max_length=100, null=True, blank=True) inquiry = models.CharField(max_length=1000) respond = models.CharField(max_length=1000) # Custromer Info company = models.ForeignKey(Company, on_delete=models.PROTECT, blank=True, null=True) store = models.ForeignKey(Store, on_delete=models.PROTECT, blank=True, null=True) is_contact = models.BooleanField(default=False) contact = models.ForeignKey(CustomerContact, on_delete=models.PROTECT, blank=True, null=True) contact_name = models.CharField(max_length=100, blank=True, null=True) email = models.EmailField(max_length=100, blank=True, null=True) phone = models.CharField(max_length=100, blank=True, null=True)
シリアライザーの内容
各アプリのSerializers.pyが先ほどのDBとコミュニケーションをとるmodels.pyをシリアル化してAPIの役目をします。チケットの例でいうとReadのGETリクエストが来たときとその他のリクエストで別々のリスポンスを返すようにしています。その設定はViews.pyで行いますが、APIの内容はここで決めます。
https://github.com/TraitOtaku/Django-TicketAppAPI/blob/master/tickets/serializers.py
class TicketSerializer(serializers.ModelSerializer): # ticket_date = serializers.DateTimeField() ticket_date = serializers.DateTimeField( format="%m/%d/%Y %H:%M", input_formats=["%m/%d/%Y %H:%M"]) # complete_by = serializers.DateField(allow_null=True) # complete_by = serializers.DateField( # format="%m/%d/%Y", allow_null=True) complete_by = serializers.DateField( format="%m/%d/%Y", input_formats=["%m/%d/%Y"], allow_null=True) class Meta: model = Ticket fields = '__all__' # depth = 1 class TicketReadSerializer(TicketSerializer): category = CategorySerializer(read_only=True) updated_by = MemberSerializer(read_only=True) created_by = MemberSerializer(read_only=True) escalated_to = MemberSerializer(read_only=True) contact = CustomerContactReadSerializer(read_only=True) store = StoreSerializer(read_only=True) company = CompanySerializer(read_only=True)
UIからデータを操作してみる
では、実際にDjangoのAPIのUIを使用してデータを操作してみましょう。
http://172.104.81.40/api/tickets/
{ "ticket_date": "01/01/2022 21:15", "complete_by": null, "is_open": false, "is_email": false, "open_details": "", "inquiry": "新しいパソコンが欲しい", "respond": "しょうがないね", "is_contact": false, "contact_name": "", "email": "okyakusama@ichiban.com", "phone": "123-123-123", "category": 1, "created_by": 1, "updated_by": null, "company": null, "store": 1, "contact": null }
上記のJSONデータを入れてあげると、DjangoからAcceptのリスポンスが返されてデータが追加されました。

レコードの更新と削除
先ほど作成したレコードはIDが1で作成されました。このデータにアクセスするには下記のようにURLの最後にIDを追加すればOKです。
http://172.104.81.40/api/tickets/1/
そうするとDELETEのオプションと下記にPUTとPATCHのオプションが追加されるのでそこからレコードを削除するなり修正するなりできます。