2022年9月11日日曜日

Django 覚書12 Pythonのmap filter等の使い方で注意が必要なこと

 スクエアのサブスクリプションのリストには、カスタマーIDが表示されるが、これをアプリ内のユーザー名と紐づけする方法を考えてみた。簡単そうだが、意外にはまってしまった。結果的には、以下のようにすることで解決できたが、ここに至るまでは、試行錯誤が必要だった。

<View側>

usertmpl3=list(map(lambda ob:{'customerid':ob.customerid,'username':ob.username},User.objects.all()) )          

srclst=list(filter( lambda ob: ob.get('canceled_date',"")=="",list(result.body['subscriptions'])))

subscriptions=list(map( lambda ob : {'subsc':ob ,  'cid':next( filter(lambda ob2: ob2['customerid'].strip() == ob['customer_id'].strip() ,usertmpl3),{'customerid':"",'username':"削除"})['username'] } ,srclst ))

sng= datetime.datetime.strptime(nen1, "%Y/%m/%d")
eng=  datetime.datetime.strptime(nen2, "%Y/%m/%d")
sbdt=list(filter(lambda sd:datetime.datetime.strptime(sd['subsc']['start_date'], '%Y-%m-%d')>=sng and datetime.datetime.strptime(sd['subsc']['start_date'], '%Y-%m-%d')<= eng,subscriptions))          

注意点:usrtmpl3、srclstいずれも最後にlistを適用してある。こうしないと、うまく動作しない。(filter()関数の戻り値はgeneratorオブジェクトという記述がネット内にある。)

まわりくどい式になってしまった。もっとスマートな方法がありそうだが。値が存在しないときに「削除」という表示にしたかったので、nextを使ってみた。

<HTML>
sbdt=response.sbdt;
$('<p style=font-weight:bold;>ユーザー名  サブスクリプションID ~</p>').appendTo('.result');
for (var i in sbdt) {  
   $('<p>'+sbdt[i]['cid']+" "+sbdt[i]['subsc']['id'] ~ +'</p>').appendTo('.result');  }
       

0 件のコメント:

コメントを投稿