Django

更新の続きの続き(Total:21day64h)

なかなか成功に結びつかない!!

きのうから、全然うまくいかないのでプライマリーキーをDjango側に受け渡すように修正

  //公開非公開切替
  async getOpenFlagChaenge() {
    const res = await $api.yearmonth.getOpenFlagChaenge(this.items[0].year_month_id)
  }

dataの中にIDとオープンフラグの状態を持っていましたが、とりあえずIDをわたすだけに変更。

// 公開フラグ切替
export function getOpenFlagChaenge(year_month_id: number) {
  return (
    api.request({
      method: 'put',
      url: `api/yearmonth/open_flg_chenge/${year_month_id}`,
    })
  )
}

これでDjango側に送るようにできました

Django側でプライマリーキーを受け取る

from django.urls import path

from .views import (
    YearMonthAPI,
    YearMonthGetAPI,
    YearMonthNextGetAPI,
    YearMonthOpenFlagChangeAPI,
)

urlpatterns = [
    # 年月トラン作成
    path('yearmonth/new_create/', YearMonthAPI.as_view(), name='yearmonth.create'),
    path('schedule/year_month/<str:today>', YearMonthGetAPI.as_view(), name='scheudule_table'),
    path('schedule/next_year_month/<str:date>', YearMonthNextGetAPI.as_view(), name='next_year_flg'),
    path('yearmonth/open_flg_chenge/<int:pk>', YearMonthOpenFlagChangeAPI.as_view(), name='open_flg_change'),
]

これでViewを呼び出す時に、pkを数字として受け渡します。

class YearMonthOpenFlagChangeAPI(APIView):
    
    def put(self, request, pk, *args, **kwargs):
        yearmonth = get_object_or_404(YearMonth, year_month_id=pk)
        print(yearmonth.open_flg)
        if yearmonth.open_flg == '公':
            yearmonth.open_flg = '未'
        else:
            yearmonth.open_flg = '公'
        if self.request.user.is_superuser == False:
            raise PermissionDenied(
                _('管理者でないので実行できないです。管理者へご連絡ください')
            )
        else:
            yearmonth.save()
ごろう
やったー!うごいた!!

やっと登録ができました!
と言いながら、公式サイトでは、シリアライザーをインスタンス化してそれを保存している感じだったんでちょっと、通常のDjango風での保存ですが、単一テーブルであればとくに問題がないかなって思う。

ポイント

管理者権限が二人いて、同時に処理したら公開か未公開かめちゃくちゃになっちゃう

実は、やりながらうすうす排他制御ができていないことを思いながらとりあえず動いてから考えようですすめていました。

なので、今からは排他制御を実装しようとおもっております。

Django Concurrency で楽観排他の実装にトライ

RestAPIで実装経験ではないけど、以前Djangoのみで作った時には、使ったことがあるライブラリのDjango-Concurrencyで実装していこうと思う。

https://django-concurrency.readthedocs.io/en/latest/

pip install django-concurrency

インストールして、設定ファイルに追加します。

MIDDLEWARE = [
    'concurrency.middleware.ConcurrencyMiddleware', #追加
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    "corsheaders.middleware.CorsMiddleware",
    "django.middleware.common.CommonMiddleware",
    'django_currentuser.middleware.ThreadLocalUserMiddleware',
]

今日は、ここまでー!
少しでもコードを毎日触ることで成長を遂げている自分がいる(はず)

-Django

© 2022 ごろう@縁紡ぐ