顯示具有 Django ORM 標籤的文章。 顯示所有文章
顯示具有 Django ORM 標籤的文章。 顯示所有文章

2019年11月1日 星期五

Django 的多對多關係範例


Django ORM ( Object-relational mapping ) 提供了簡便的方法存取資料庫,

在資料庫模型中,

部分欄位是有相關性的,

在 Django 中分為一對一,多對多,一對多三種關係,

今天要來介紹的就是:

Django 的多對多關係範例

多對多關係的例子很多,

以書籍分類來說,

一本書可以有很多種分類,

而一個分類可以有很多書,

這就是屬於多對多關係,

舉個例子來說,

笑傲江湖在分類上屬於武俠小說類,

而武俠小說類除了笑傲江湖以外還有射鵰英雄傳...等等,

所以分類名與書名間就是多對多關係。


上圖為今天的範例,

課程與學生屬於多對多關係,

故在定義課程時,設定一個欄位為 ManyToManyField,

系統會自動建立一個中間表,


這個中間表定義了 User 與 Tcourse 間的關係,

至於兩者關係的處理方式,

可透過 add, remove, set, clear 等等,

來新增、刪除、設定、清除。


使用方式可分為正向查詢與反向查詢,

正向查詢的用法:

以上述例子為範例,

查詢修習課程 course 下的所有學生


alluser = Tcourse.objects.get(course_name='course').tstaff.all()


反向查詢:

查詢學生 xuser 修習的所有課程


allcourse = User.objects.get(username='xuser').tcourse_set.all()


至於多對多關係的建立,

可使用


Tcourse.objects.get(course_name='course').tstaff.add(tmp_user)


這邊指的是幫學生 tmp_user 加選課程名稱為 course 的課程

退選課程則使用:


Tcourse.objects.get(course_name='course').tstaff.remove(tmp_user)


當然其他還有許多應用,

甚至還有一對多,一對一關係,

請待下回分解,

這裡是不及格研究室,

今天的主題是:

Django 的多對多關係範例







2019年9月30日 星期一

Django 資料新增刪除與修改


之前曾經簡單介紹過Django基礎,

也介紹過admin管理資料庫的兩種方法,

今天就來教大家:

Django 資料新增刪除與修改

上次有提到過,

Django不需要撰寫SQL語言來修改資料,

只需要對Django ORM作處理,

假設今天有個學生資料庫如下:

class student(models.Model):
  cname = models.CharField(max_length=50, blank=False, unique=True)
  caddr = models.CharField(max_length=100, blank=True)

透過網址傳送username來新增資料,

以

[model_name].object.create()

再透過save()即可新增一個物件


def add_user(request):
    username = request.GET.get('username')
    cuser = student.objects.create(cname=username)
    cuser.save()
    return HttpResponse(cuser.cname)


def del_user(request):
    username = request.GET.get('username')
    duser = student.objects.get(cname=username)
    duser.delete()
    return HttpResponse(duser.cname)


def modify_user(request):
    username = request.GET.get('username')
    muser = student.objects.get(cname=username)
    muser.cname = 'test'    
    muser.save()
    return HttpResponse(muser.cname)

至於修改部分:

則是以

[model_name].object.get(cname=username)

先取得 cname = username 的 物件,

直接修改欄位的值,

此範例為 cname ,

改完以後再以 save() 儲存即可,


刪除的話:

透過

[model_name].object.get(cname=username)

找到要刪除的物件,

直接以 delete() 方法刪除即可。


如同之前所說,

資料新增刪除與修改,

都沒有使用到 SQL 語言,

這對設計者相當的便利。