Django REST APIを一般公開しています。


PythonのウェブフレームワークDjangoで作成したREST　APIを公開したので是非使ってみてください。
自由にCRUD作業してOKです。今のところはリクエスト数に制限もありません。
http://172.104.81.40/api/

ただし１時間ごとにDBがデフォルトに戻るので入力されたデータは削除されることになります。

良かったら自分でホスティングしているサイトとYouTubeがあるので他の記事も見てみてください。
[<img src="https://asameshicode.com/wp-content/uploads/2022/12/asameshiLogo.jpg">](https://asameshicode.com/)

https://www.youtube.com/channel/UCiVt4Mcnog4KBEOALesuu1g



# APIの概要

このAPIはコールセンターをイメージしたDBを構成し、CRUD操作（Create,Read,Update,Delete）を可能にしたAPIです。

もう一つにトークン認証でログインしたユーザーのみアクセスできるAPIも別に公開しています。
そちらは、81番ポートからアクセスしてください。今回はトークン認証の不要な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のリスポンスが返されてデータが追加されました。

[<img src="https://asameshicode.com/wp-content/uploads/2022/11/image-52.png">](https://asameshicode.com/django-rest-api-demo/)

レコードの更新と削除

先ほど作成したレコードはIDが１で作成されました。このデータにアクセスするには下記のようにURLの最後にIDを追加すればOKです。

http://172.104.81.40/api/tickets/1/

そうするとDELETEのオプションと下記にPUTとPATCHのオプションが追加されるのでそこからレコードを削除するなり修正するなりできます。

同じ記事はこちらかも見れます。
https://asameshicode.com/django-rest-api-demo/
お疲れ様でした。