django -- ORM實現圖書增刪改查

表結構設計

上篇咱們實現了出版社的增刪改查,出版社數據表有兩個字段id和name,那圖書的表結構怎麼設計呢?圖書也要有一個主鍵id,還要有一個名稱title,是哪一個出版社的,要有個字段press和Press表裏的id對應,這樣圖書就須要三個字段,id,title,presshtml

 

建立表

# 圖書表
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)  # 書名
    press = models.ForeignKey(to='Press',on_delete=models.CASCADE)  # 和出版社表關聯的字段

由於書和出版社是多對一的關係,一個出版社能夠出版多個書,因此外鍵要寫在多的這張表裏面,也就是Book表裏面python

而後執行數據庫

python manage.py makemigrations
python manage.py migrate

說明:to='Press' 默認關聯的是Press下的主鍵,on_delete=models.CASCADE級聯刪除,也就是若是你刪除了出版社,Django會把你這個出版社關聯的書都刪掉。固然你也能夠設置成null或者其餘的默認值,不須要刪除書。Django1.11中,默認就是級聯刪除,Django2.0以後必須指定on_deleteide

 

to=關聯的表名,默認關聯表裏的主鍵,還有就是咱們的字段是press,可是ORM在操做的時候,會在後面加上_id,在數據庫裏查看字段顯示以下函數

 

獲取表裏的數據

咱們往數據表裏手動加些數據oop

url(r'^book_list/', views.book_list),  # 展現圖書列表

在去添加對應的函數post

#獲取圖書列表返回給頁面
def book_list(request):
    #查詢全部的書籍
    data = Book.objects.all()
    return render(request, 'book_list.html', {"data":data})

添加book_list.html文件url

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>圖書列表</title>
</head>
<body>
    <table border="1">
        <thead>
            <tr>
                <th>序號</th>
                <th>書ID</th>
                <th>書名</th>
                <th>出版社名</th>
            </tr>
        </thead>

        <tbody>
            {% for i in data %}
                <tr>
                    <td>{{ forloop.counter }}</td>
                    <td>{{ i.id }}</td>
                    <td>{{ i.title}}</td>
                    <td>{{ i.press.name }}</td>
                </tr>
            {% endfor %}

        </tbody>
    </table>

</body>
</html>
book_list.html

說明:spa

#查詢全部的書籍
data = Book.objects.all()
#獲取第一本書
first_book = data[0]
print(first_book)  #Book表的對象

#取到對象的title屬性
print(first_book.title)

#取到對象的press屬性
print(first_book.press)  # press表的對象

#取到這本書關聯的出版社的名稱
print(first_book.press.name)

#取到和我這本書關聯的出版社id,也就是book表裏的press_id
print(first_book.press_id)

#連表查詢到出版社id
print(first_book.press.id)

結果:設計

Book object
python從入門到放棄
Press object
北大出版社
15
15

 

增長圖書

 添加路由

url(r'^add_book/', views.add_book),  # 添加圖書

添加函數

#添加圖書
def add_book(request):
    if request.method == "POST":
        #獲取用戶填寫的書名
        book_title = request.POST.get('book_title')
        #獲取用戶選擇的出版社id
        pre_id = request.POST.get('press_id')
        '''
        基於外鍵對象的建立
        press_obj=Press.objects.get(id=press_id)
        Book.objects.create(title=book_title, press=press_obj)
        '''
        #基於外鍵id值的建立
        Book.objects.create(title=book_title, press_id=pre_id)
        return redirect('/book_list/')

    data = Press.objects.all()
    return render(request, 'add_book.html', {"press_id": data})

添加add_book.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加書籍</title>
</head>
<body>
<h1>添加數據</h1>
<form action="/add_book/" method="post">
    <input type="text" name="book_title">
    <select name="press_id">
        {% for press in press_id %}
            <option value="{{ press.id }}">{{ press.name }}</option>

        {% endfor %}

    </select>
    <input type="submit" value="添加">
</form>

</body>
</html>
add_book.html

 

 

刪除圖書

在book_list.html裏增長以下代碼

{% for i in data %}
      <tr>
          <td>{{ forloop.counter }}</td>
          <td>{{ i.id }}</td>
          <td>{{ i.title}}</td>
          <td>{{ i.press.name }}</td>
           <td>
               <a href="/delete_book/?id={{ i.id }}">刪除</a>   這句
           </td>
     </tr>
{% endfor %}

添加路由

url(r'^delete_book/', views.delete_book),  # 刪除圖書

添加對應的函數

#刪除圖書
def delete_book(request):
    delete_book_id = request.GET.get('id')
    Book.objects.filter(id=delete_book_id).delete()
    return redirect('/book_list/')

 

編輯圖書

添加路由

url(r'^edit_book/', views.edit_book),  # 編輯圖書

添加對應的函數

# 編輯圖書
def edit_book(request):
    # 從url中取到要編輯的書籍的id值
    edit_book_id = request.GET.get('id')

    # 根據id值找到要編輯的書籍對象
    edit_book_obj = Book.objects.get(id=edit_book_id)

    if request.method == 'POST':
        # 取到用戶修改後的書籍名稱和出版社信息
        new_title = request.POST.get('book_title')
        new_press_id = request.POST.get('press_id')

        # 修改書籍相應信息
        edit_book_obj.title = new_title
        edit_book_obj.press_id = new_press_id

        # 保存到數據庫
        edit_book_obj.save()

        return redirect('/book_list/')

    # 把全部的出版社查詢出來
    press_data = Press.objects.all()
    return render(request,'edit_book.html', {'book_obj':edit_book_obj, 'press_list': press_data})

添加html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>編輯書籍</title>
</head>
<body>
    <h1>編輯書籍</h1>
    <form action="" method="post">
        <input type="text" name="book_title" value="{{book_obj.title }}">

        <select name="press_id" >
            {% for press in press_list %}
                {% if book_obj.press == press %}
                     <option selected value="{{press.id }}">{{ press.name }}</option>
                 {% else %}
                     <option value="{{press.id }}">{{ press.name }}</option>
                {% endif %}

            {% endfor %}

        </select>
        <input type="submit" value="提交">
    </form>

</body>
</html>

 

總結

 

ORM外鍵
  press = models.ForignKey(to='Press', on_delete=models.CASCADE)

 

查詢
  1. book_obj.press --> ORM層面封裝的,返回的是和我這本書關聯的出版社對象
  2. book_obj.press_id --> 數據庫中真正存在的字段,保存的是和我關聯的出版社id值

 

編輯

Django模板語言中的if判斷   {% if 條件 %}    知足時執行的語句   {% else %}    不知足時執行的語句   {% endif %}

相關文章
相關標籤/搜索