iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
Software Development

做一支專屬自己學校的課程評價 LINE Bot 吧!系列 第 13

[Day 13] 利用資料表做出課程名的簡稱吧!

  • 分享至 

  • xImage
  •  

科技來自於懶性

有些課名實在是太長了,總會有許多神奇的簡稱出現,特教導=特殊教育導論、普生=普通生物學、脊比=脊椎動物比較解剖,而這些用詞若輸入在機器人反而都無法回覆,由於人類對於發想簡稱是沒有相對固定的形式,實務上多仰賴在學生彼此之間的口耳相傳,於是今天就做一個課名與簡稱的資料表,讓使用者能以簡稱方式輸入課名。

課程名的簡稱關係

一堂課可能有不一樣的簡稱,所以需要一個新資料表,本來想要設計關聯式的資料表,但是問了問 ChatGPT 似乎沒有比較好的設計方法,如果先進前輩有好的建議請不吝留言指教~

定義需求

  • 使用者輸入課程簡稱時,會跳出對應的老師列表選項,點選即可跳出對應評價

編寫邏輯

  1. 新增一課名簡稱資料表: 欄位包含全名、簡稱

    class CourseAlias(models.Model):
        course_name = models.CharField(max_length=20, verbose_name="課名全稱")
        alias = models.CharField(max_length=20, verbose_name="課程簡稱")
    
        def __str__(self):
            return self.alias
    
  2. admin.py 新增相關資料:

     from .models import Course, CourseAlias
     @admin.register(CourseAlias)
     class CourseAliasAdmin(ImportExportModelAdmin):
         list_display = ('course_name', 'alias')
    
  3. 遷移資料表:

    $ py manage.py makemigrations
    
    $ py manage.py migrate
    
  4. 使用者輸入課名時,先篩選全名再找找簡稱: 一點都不複雜,就是在原本 handle_msg 函式的二分法判斷中,最後再加入簡稱的搜尋,所以就再加上個 elif~
    在函式的前幾行先進行資料表的搜尋:

    # hulolo > chatbot > views.py
    filtered_teacher = Course.objects.filter(teacher_name=user_message)
    filtered_course = Course.objects.filter(course_name=user_message)
    
    # 新增了對課名簡稱資料表的搜尋
    filtered_course_alias = CourseAlias.objects.filter(alias=user_message)
    
    # hulolo > chatbot > views.py
    # 如果課名簡稱資料表有值
    elif filtered_course_alias.exists():
        # 取得對應的課名簡稱全稱
        full_course_name = filtered_course_alias.course_name
    
        # 再將全稱去搜尋 Course 資料表的內容
        filtered_course = Course.objects.filter(course_name=full_course_name).values_list(
        'teacher_name', flat=True).distinct()
    
        # 後面則與先前查詢課名邏輯相同
        flex_message = dynamic_flex_message_package(
        course_name, candidate_teachers, label_type='teacher')
    
        message = FlexSendMessage(
                            alt_text=f"{course_name} 的老師",
                            contents=flex_message
                        )
        line_bot_api.reply_message(
                    event.reply_token,
                    message)    
        else:
            print("Empty")   
    

結果

無論輸入 特殊教育學生評量特教評 都能夠跑出對應的列表:
https://ithelp.ithome.com.tw/upload/images/20240928/20151510CjdhEZ5oR9.png

再往前一點點

  • 因為今天在烤肉,所以就不往前了,但仍然會往前的可能是體重。

覆盤

在這篇文章中,我們學會了:

  • 透過兩個資料表的邏輯查表建立簡稱與評價查詢的關係
  • Day 13 原始碼

上一篇
[Day 12] 函式的可重複利用性: 無論輸入課名或老師名都可以跳出選項
下一篇
[Day 14] 中場休息: 當生物仔踏入軟體開發,跨領域的學習連結
系列文
做一支專屬自己學校的課程評價 LINE Bot 吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言