django 프로젝트 및 앱 생성하는 법은 생략하고 내가 진행한 특이거래 알림을 구현하기 위한 프로젝트 코드를 참고하여 나중에 해매지 않고 잘 구현할 수 있도록 하자.
# settings.py
INSTALLED_APPS = [
'rest_framework',
'restapi.apps.RestapiConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
# restapi/models.py
from django.db import models
# Create your models here.
class Transaction(models.Model):
id = models.AutoField(primary_key=True)
uid = models.CharField(max_length=45)
tran_dt = models.TextField()
code = models.IntegerField()
md_type = models.IntegerField()
wd_code = models.IntegerField()
net_code = models.IntegerField()
tran_amt = models.IntegerField(default=0)
result = models.CharField(max_length=4, null=True)
note = models.TextField(blank=True, null=True)
def __str__(self):
return self.id
class UserInfo(models.Model):
id = models.AutoField(primary_key=True)
uid = models.CharField(max_length=45, unique=True)
c0 = models.IntegerField(default=0)
c1 = models.IntegerField(default=0)
c2 = models.IntegerField(default=0)
c3 = models.IntegerField(default=0)
c4 = models.IntegerField(default=0)
c5 = models.IntegerField(default=0)
c6 = models.IntegerField(default=0)
c7 = models.IntegerField(default=0)
c8 = models.IntegerField(default=0)
c9 = models.IntegerField(default=0)
c10 = models.IntegerField(default=0)
c11 = models.IntegerField(default=0)
c12 = models.IntegerField(default=0)
c13 = models.IntegerField(default=0)
c14 = models.IntegerField(default=0)
c15 = models.IntegerField(default=0)
c16 = models.IntegerField(default=0)
c17 = models.IntegerField(default=0)
c18 = models.IntegerField(default=0)
c19 = models.IntegerField(default=0)
c20 = models.IntegerField(default=0)
c21 = models.IntegerField(default=0)
c22 = models.IntegerField(default=0)
c23 = models.IntegerField(default=0)
note = models.TextField(blank=True, null=True)
def __str__(self):
return self.id
# restapi/serializers.py
from rest_framework import serializers
from .models import Transaction, UserInfo
class TransactionSerializer(serializers.ModelSerializer):
class Meta:
model = Transaction
fields = '__all__'
class UserInfoSerializer(serializers.ModelSerializer):
class Meta:
model = UserInfo
fields = '__all__'
# restapi/urls.py
from django.urls import include, path
from restapi.views import TransactionViewAPI
urlpatterns = [
path('', TransactionViewAPI.as_view()),
]
# restapi/views.py
from .serializers import TransactionSerializer, UserInfoSerializer
from .models import Transaction, UserInfo
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
import numpy as np
from UTD.utd import UniqueTransactionDetect
from UTD.make_parameter import *
utd_model = UniqueTransactionDetect()
# Create your views here.
class TransactionViewAPI(APIView):
def get(self, request):
# queryset = UserInfo.objects.all()[0:1]
# serializer = UserInfoSerializer(queryset, many=True)
context = { "설명": "POST 방식으로 아래와 같은 api를 호출해주세요.",
"uid": "UID(ex. UID001)",
"tran_dt": "거래발생 시간(ex. 2020-10-12 13:42:00)",
"code": "업무코드 {1: 홈펌뱅킹 출금, 2: 홈펌뱅킹 입금, 3: CD/ATM 지급, 4: CD/ATM 이체출금,\
5: CD/ATM 이체입금, 6: CD/ATM 입금, 7: CD/ATM 납부, 8: 오픈뱅킹 조회(사용X),\
9: 오픈뱅킹 출금, 10: 오픈뱅킹 입금, 11: 지로공동망 자동이체, 12: 지로공동망 납부자자동이체 이체출금,\
13: 지로공동망 납부자자동이체 이체입금, 14: CMS공동망 자동이체,}",
"md_type": "매체구분 {1: PC뱅킹, 2: 인터넷뱅킹, 3: 전화, 4: 휴대전화, 5: 건별이체, 6: 기타, 7: 대량이체}",
"wd_code": "입출구분 {0: 입금, 1: 출금}",
"net_code": "망구분 {0: 전자금융공동망, 1: CD/ATM, 2: 오픈뱅킹, 3: 납부자 자동이체, 4: CM 공동망}",
"tran_amt": "거래금액"}
return Response(context)
def post(self, request):
global utd_model
serializer = TransactionSerializer(data=request.data) # Request의 data를 UserSerializer로 변환
if serializer.is_valid():
serializer.save() # UserSerializer의 유효성 검사를 한 뒤 DB에 저장
# 1. uid: UID(ex. UID001)
# 2. tran_dt: 거래발생 시간(ex. 2020-10-12 13:42:00)
# 3. code: 업무코드 {1: 홈펌뱅킹 출금, 2: 홈펌뱅킹 입금, 3: CD/ATM 지급, 4: CD/ATM 이체출금,
# 5: CD/ATM 이체입금, 6: CD/ATM 입금, 7: CD/ATM 납부, 8: 오픈뱅킹 조회(사용X),
# 9: 오픈뱅킹 출금, 10: 오픈뱅킹 입금, 11: 지로공동망 자동이체, 12: 지로공동망 납부자자동이체 이체출금,
# 13: 지로공동망 납부자자동이체 이체입금, 14: CMS공동망 자동이체,}
# 4. md_type: 매체구분 {1: PC뱅킹, 2: 인터넷뱅킹, 3: 전화 4: 휴대전화, 5: 건별이체 6: 기타, 7: 대량이체}
# 5. wd_code: 입출구분 {0: 입금, 1: 출금}
# 6. net_code: 망구분 {0: 전자금융공동망, 1: CD/ATM, 2: 오픈뱅킹, 3: 납부자 자동이체, 4: CM 공동망}
# 7. tran_amt: 거래금액
# 파생변수 생성 및 전처리 순서
# 1. 거래시간 범위 생성
# 2. 요일 생성
# 3. 거래시간대 생성
# 4. 거래금액 스케일링
data = serializer.data
data["tran_tmrg"] = make_trantmrg(data["tran_dt"], data["net_code"])
data["tran_weekday"] = make_tranweekday(data["tran_dt"])
data["attime"] = make_attime(data["tran_dt"], data["net_code"])
data["tran_amt_log"] = preprocess_amt(data["tran_amt"])
data_list = list()
data_list.append(data["tran_tmrg"])
data_list.append(data["code"])
data_list.append(data["md_type"])
data_list.append(data["wd_code"])
data_list.append(data["net_code"])
data_list.append(data["tran_weekday"])
data_list.append(data["attime"])
data_list.append(data["tran_amt_log"])
data_np = np.array(data_list)
result = utd_model.predict_result(data_np)
get_id = Transaction.objects.get(pk=serializer.data['id'])
get_id.result = result
get_id.save()
get_uid = UserInfo.objects.filter(uid=data['uid']).values()[0]
if get_uid[result] != 0:
return Response({"tran_result": result, "adn_result": "정상"}, status=status.HTTP_201_CREATED) # client에게 JSON response 전달
else:
return Response({"tran_result": result, "adn_result": "이상", "data": get_uid}, status=status.HTTP_201_CREATED) # client에게 JSON response 전달
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('restapi.urls')),
]