코드 리팩토링-API1

김의석 ·2024년 5월 2일

Hello! Poko Ver.1

목록 보기
20/20

프로젝트의 Checking App의 모델 수정 후 변경 된 모델의 내용을 반영하여 views.py 수정

models.py 수정

수정 전

    if request.method == "POST":
        date = request.POST.get("date", "")

		# teacher_name을 생성하기 위한 Query Set과 DataFrame
        users = User.objects.all()  
        user_df = pd.DataFrame(columns=["teacher_id", "teacher_name"])
        for user in users:
            user_info = [
                user.username,
                user.first_name + user.last_name,
            ]
            user_df = user_df._append(
                pd.Series(user_info, index=user_df.columns), ignore_index=True
            )

		# date로 filtering한 Query Set과 DataFrame
        filter_date = Attendance.objects.filter(date__icontains=date)
        date_df = pd.DataFrame(data=filter_date.values())
		
        # teacher_id 기준으로 merge
        df = pd.merge(
            date_df, user_df, on="teacher_id", how="left"
        )

수정 후

def ApiGraphWeekly(request, date):
    if request.method == "POST":
        date = request.POST.get("date", "")
		
        # Forreign Key를 이용한 Query Set
        AttendanceToTeacher = (
            Attendance.objects.select_related("name__teacher")
            .values(
                "name__teacher__username",
                "name__teacher__first_name",
                "name__teacher__last_name",
                "name__name",
                "attendance",
                "date",
            )
            .filter(date__icontains=date)
        ).order_by("attendance")

        AttendanceToTeacher_df = pd.DataFrame(data=AttendanceToTeacher)
        AttendanceToTeacher_df["teacher_name"] = (
            AttendanceToTeacher_df["name__teacher__first_name"]
            + AttendanceToTeacher_df["name__teacher__last_name"]
        )
  • 수정 된 모델의 Foreign Key를 활용으로 원하는 Data Frame 생성과 병합이 동시에 가능

  • 최소한의 object()함수 사용

    • 2번에서 수정 후 1번으로 단축

AttendanceToTeacher = (
            Attendance.objects.select_related("name__teacher")
            .values(
                "name__teacher__username",
                "name__teacher__first_name",
                "name__teacher__last_name",
                "name__name",
                "attendance",
                "date",
            )
  • Django ORM으로 Attendance 모델과 User 모델의 정보를 Join하여 필요한 필드를 선택하는 쿼리

  • select_related() 메서드는 ForeignKey 필드를 통해 다른 모델과의 관계를 정의한 경우에만 사용

profile
널리 이롭게

0개의 댓글